<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://mikeyan01.github.io/</id>
  <title type="text">MikeYan01</title>
  <subtitle type="text">Hello world!</subtitle>
  <updated>2026-01-23T00:00:00.000Z</updated>
  <author><name>MikeYan01</name></author>
  <link rel="alternate" href="https://mikeyan01.github.io/"/>
  <link rel="self" href="https://mikeyan01.github.io/atom.xml"/>
  <generator>Firefly v6.16.8</generator>
    <entry>
      <id>https://mikeyan01.github.io/posts/2026-01-23-nba-simulator%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F/</id>
      <title type="text">NBA Simulator的前世今生</title>
      <published>2026-01-23T00:00:00.000Z</published>
      <updated>2026-01-23T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2026-01-23-nba-simulator%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F/"/>
      <summary type="text">聊聊这些年我设计NBA Simulator的故事。</summary>
      <content type="html"><![CDATA[<p>聊聊这些年我设计NBA Simulator的故事。</p>

<section><h2>前言<a href="#前言"><span>#</span></a></h2><p>作为一个NBA爱好者，小时候我一直梦想有一个模拟工具能时时刻刻模拟NBA比赛，让我能在任何时刻过足比赛瘾。上个月在AI的强力加持下，我终于拥有了一个这样的前端页面，理想初具雏形，以此有感而发记录一下它的前世今生。</p></section>
<section><h2>1.0版本：计算器上的原型探索<a href="#10版本计算器上的原型探索"><span>#</span></a></h2><p>中学时期我经常拿卡西欧计算器来生成随机数。有一天我突然想到，如果将NBA比赛的每一个回合拆分成若干事件（选择球员，球员投篮，投篮命中，…），再用随机数的生成结果来对应这些事件的结果，就能预测一个回合；由于每个回合会随机消耗一定时间，因此只要预测足够多的回合，就能模拟一场比赛。这个思路延用至今，所有的NBA模拟延伸都是在这个基础上进行两个部分的打磨：事件的拆分以及随机数概率的调整。</p><p>彼时我还没有接触计算机编程，并且也没有自动化的工具，因此很多时候就是靠着一台计算器、一张纸和一根笔人力完成了一场比赛的模拟。并且最初的事件拆分也比较原始，事件只考虑了最基本的得分，随机数概率范围也基本只考虑了球员的综合能力。然而即便是这样，一场比赛的人力成本也相当之大，因为我需要用纸笔记录所有回合的得分情况，一晚上常常洋洋洒洒写满两三张草稿纸。现在想起那段时光，尽管模拟工作量巨大，但是它也有效缓解了学业压力，仿佛在意念上摸鱼逃课看了N场球。</p></section>
<section><h2>2.0版本：编程的最初尝试<a href="#20版本编程的最初尝试"><span>#</span></a></h2><p>大一接触了面向对象程序设计后，我发现篮球比赛是面向对象编程的完美载体，因为球员、球队、比赛等等都可以抽象为对象和类，并进行相应封装。在假期的时候我开始用C++实现比赛的模拟，然而彼时我对C++的使用并不熟练，代码写得相当冗余，几天洋洋洒洒码了四五千行之后却只实现了一个非常简陋的版本（只能预测比赛结果，并且还因为C++相对复杂的内存管理，时不时遇到内存泄漏或者栈溢出），光是debug就花费了一周。然而自动化带来的提升是显而易见的，原来模拟一场比赛需要1-2天的人力劳动，现在只需要不足5秒。这也使我得以观测大量比赛的模拟结果，并且逐步尝试加入更多的回合事件。抢篮板、助攻、抢断、盖帽、犯规等等事件都是在这个阶段被陆续加入程序中的。</p><p>彼时我常常用虎扑App看NBA比赛的文字直播，妙趣横生的解说词让观众相当具有代入感。有一天我意识到，我的模拟程序也完全可以加入这些解说词，这比起模拟结束简单生成一个结果要有趣得多。于是我从许多解说比赛里挑选了一些有意思的解说词，在回合模拟的间隙中通过控制台输出。这个改进也让我的模拟初步拥有了“实况”的感觉。许多解说词甚至保留到了今天的版本里。</p></section>
<section><h2>3.0版本：日复一日地打磨<a href="#30版本日复一日地打磨"><span>#</span></a></h2><p>2020年，疫情时代来临，NBA遭受冲击被迫停赛，无球可看的我又掏出了我的模拟程序解闷。经过几年的专业学习，我自然而然地发现了诸多当年代码设计的缺陷，我意识到是时候推倒重构了。由于我当时常在LeetCode上用Java刷题，重构时的语言选择上我也选择了用Java练手。</p><p>最初我的重构野心很小，仅仅只是用Java重写一个简练、精致的新版本。Java的语法相比C++会简单一些，再加上更合理的面向对象设计，我很快实现了这个目标。这时我又产生了新的念头 - 既然我能从逐个回合推演一场比赛，为什么我不能从逐场比赛推演一个赛季呢？这瞬间让这个程序更上一层楼 - 从单场比赛的胜者模拟蜕变为赛季冠军模拟。代码上的实现需要的成本也并不高，仅仅只需要找到NBA的赛程安排导出成文件，再根据NBA的赛制规则实现一个季后赛模式即可。这个改动让我立即获得了新的乐趣，因为看到模拟程序生成冠军明显比看到一场普通比赛的胜者更引人入胜。然而赛季模式的引入也开始暴露出我程序的缺陷。此前的单场比赛模拟中，我并没有留意球员数据模拟结果的质量 - 从随机数角度来说，单场比赛样本太小，模拟出怎么样的结果都说得通。然而赛季模式下因为有了足够的样本，我发现许多球员的数据（得分、篮板、助攻等等）都和现实相差甚远，这也让我开始反思代码层面如何调整。尽管NBA官方并没有提供球员的量化能力评价，但我找到了<a href="https://2kratings.com" target="_blank">2kratings</a>这个替代品，它能实时获取最新的NBA 2K游戏球员能力值。虽然这个能力值来源于电子游戏，但毕竟也是游戏制作团队基于现实中球员的实时表现进行调整的，具有一定的专业参考性。我根据2kratings的数据打磨了我的程序，特别是在Player类中引入了相当多的球员能力，并且重新改进了各种Utility函数，让球员的各方面能力都可以影响到比赛进程，也大大提升了模拟的真实性。后来，我又发现了<a href="https://www.basketball-reference.com" target="_blank">Basketball Reference</a>这个神仙网站，它提供了大量的现实比赛结果供我参考。可以说Basketball Reference大大降低了我的调参难度，它提供了真实准确的标尺，我只需要让比赛的模拟结果尽可能接近这个标尺即可。此外，我也通过数学建模改进了许多事件模拟的函数，例如投篮距离和命中率的对应引入了指数函数，回合时间的消耗引入了Sigmoid函数等等。经过了这一系列的调整之后，生成的数据质量显著提升。</p><p>我还进一步优化了比赛事件。最大的改进是引入了轮换系统，这个轮换系统会参考现实规律，结合了球员体力、负荷管理、实时手感等等的影响，让球员的总体上场时间更接近真实，也让更多替补球员有了上场发挥的机会。同时，我也尽可能引入了一些小概率事件，例如技术犯规/恶意犯规、伤病、挑战等等，让比赛更加跌宕起伏。比赛的解说词也更生动，增加了球员的反应功能，时不时能看到球员因为作出贡献而庆祝，又或者是犯错而沮丧。</p><p>另一个优化是比赛回顾相关的功能。此前的程序里面每把比赛都会生成一个对应的文本文件，单赛季总共1300多局比赛因此对应着1300多个结果文件，我根本不可能全部看完。在这个契机下我产生了做比赛回顾的念头，简要显示每局比赛输出分节比分、实时分差图，列举双方发挥的优异球员等等。这个改进大大提升了我浏览比赛的效率，我在后续的网页版本里复用了这个功能，使得网页更接近现实中体育门户网站赛后回顾比赛的体验。另外我还将单赛季模拟拓展至多赛季模拟，用这种方式预测球队夺冠的概率，进一步评估球队的实力差距。</p><p>在经过了前后几年断断续续的打磨之后，这个版本最终被我封存在了<a href="https://github.com/MikeYan01/NBA-sim" target="_blank">https://github.com/MikeYan01/NBA-sim</a>这个库里面。可以说这个版本是承上启下之作，它从一个不成熟的玩具变成了一个相对真实可靠的程序，并且囊括了绝大多数我想要的功能。未来我不会再更新这个代码库，但它对我而言可能是最具纪念意义的一个版本。</p></section>
<section><h2>4.0版本：AI时代的如虎添翼<a href="#40版本ai时代的如虎添翼"><span>#</span></a></h2><p>2024年开始，AI agent如雨后春笋般爆发，我的模拟器也在AI加持下实现了再次蜕变，从一个命令行程序变成了一个前端页面。</p><p>我的设想是利用AI将Java程序用TypeScript再次重构，加上可视化的网页UI。原本我以为重构对AI agent是小菜一碟，而网页UI才会花费较多精力，没想到重构的时候AI遇到了诸多幺蛾子，UI倒是几乎一步到位就画好了，这还是在我使用了<a href="https://github.com/github/spec-kit" target="_blank">Spec Kit</a>这样的工具，按步骤、阶段为AI规划了重构任务的前提下。最主要的缺陷在于AI agent没有充分理解全部代码，在移植时总是会遗漏一部分原有的代码实现（例如在判断犯规的时候只考虑了防守犯规，没考虑进攻犯规等等），以致于需要反复人工检查校对，估计在现有agent技术下，上下文长度限制还是让AI难以一步到位完成重构。UI部分则令人惊艳，Claude给出的设计简洁美观，尤其是球员赛后数据Box score部分和现实中门户网站的UI设计相差无几；反而是前端界广受赞誉的Gemini 3 Pro设计的UI第一眼没有让我满意。不过总体而言整个移植过程还是比较顺利的，这让我对未来人类和AI共智的合作模式也有了更高的期待。</p><p>AI在内容创作上也大大提升了效率。此前我一直希望拓展解说语料库丰富比赛输出，AI不仅帮我拓展了诸多内容，甚至还顺带帮我抽象了相关数据库结构方便后续拓展。此外它还提供了翻译支持，我的前端页面目前支持了中英双语，未来的i18n拓展自然也重构为更灵活的架构。</p><p>这个版本目前被我存储在<a href="https://github.com/MikeYan01/NBA-Sim-Web" target="_blank">https://github.com/MikeYan01/NBA-Sim-Web</a>这个库里，并且也部署到了<a href="https://mikeyan01.github.io/NBA-Sim-Web/">https://mikeyan01.github.io/NBA-Sim-Web/</a>页面上。至此，我终于可以随时随地，从任何设备上访问我的模拟程序，观看NBA模拟比赛了。</p></section>
<section><h2>5.0版本：？<a href="#50版本"><span>#</span></a></h2><p>4.0版本几乎已经是我在中学时代的梦想了 - 随时随地，有一个可视化页面能够访问我的NBA模拟程序，并且能看到真实详尽的比赛解说与球队/球员数据。不过也必须要承认的是现阶段的版本仍然有诸多不足，例如解说词的堆叠有时比较生硬，以及部分复杂的比赛事件暂时还未实现（例如比赛末尾时的犯规战术等等）。更远一步畅想，现在的文字模拟版本在AI时代完全有可能拓展成图形甚至是视频版本，因此这十多年的版本更迭一定不是句号。希望我能一致保持这份初心，拥抱技术，让梦想继续进化。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2024-02-14-animenz%E9%92%A2%E7%90%B4%E6%94%B9%E7%BC%96%E4%B8%BB%E8%A7%82top20%E8%AF%84%E6%B5%8B/</id>
      <title type="text">Animenz钢琴改编主观Top20评测</title>
      <published>2024-02-14T00:00:00.000Z</published>
      <updated>2024-02-14T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2024-02-14-animenz%E9%92%A2%E7%90%B4%E6%94%B9%E7%BC%96%E4%B8%BB%E8%A7%82top20%E8%AF%84%E6%B5%8B/"/>
      <summary type="text">主观向聊聊个人最喜欢的20首Animenz动漫钢琴改编。</summary>
      <content type="html"><![CDATA[<p>主观向聊聊个人最喜欢的20首Animenz动漫钢琴改编。</p>

<section><h2>前言<a href="#前言"><span>#</span></a></h2><p>Animenz (<a href="https://www.youtube.com/@Animenzzz/videos" target="_blank">Youtube主页</a>)是近年出名的动漫歌曲改编钢琴家。相对于扎实的演奏水平，他的改编风格更加令人印象深刻，我尤其惊叹于他对于多声部的驾驭能力以及丰富的和谐编排，颇有一种“一个人就是一支乐队”的气势。以下列举出我个人最喜欢的20首Animenz改编作品。</p></section>
<section><h2>No.20 Avid<a href="#no20-avid"><span>#</span></a></h2><p>出自动漫《86-不存在的战区-》。</p><p>这首改编是近年Animenz的创新之作之一。除了招牌的多手技巧与旋律处理，Animenz着重突出了整首改编的“空灵感” - 这种感觉主要来源于Animenz对于踏板的独到理解。Animenz在多个地方仅仅半踩踏板，让延音保持着和谐的同时，缓慢减弱：</p><blockquote><p>Fitting to the lyrics of 「Avid」(“it calls, it calls”), I let the piano “resonate” its sound a bit more than usual by mostly using half pedal during the performance and releasing the sustain pedal very slowly for longer notes. This creates a very interesting “mixed harmonic”, which slowly clears up by itself until only a very few notes remain. It can be heard in 1&lt;47&gt;, 4&lt;04&gt;, and 5&lt;02&gt;.</p></blockquote></section>
<section><h2>No.19 One Last Kiss<a href="#no19-one-last-kiss"><span>#</span></a></h2><p>出自动漫《新世纪福音战士》。</p><p>宇多田光的这首名作其实并不容易改编 - 原曲中充满了大量节奏强烈的和弦，倘若改编时只知道一味重音砸琴，会使得听感特别嘈杂。用Animenz的话形容便是：</p><blockquote><p>I also had to arrange the voicing on the piano very carefully in order to distinguish the multiple layers of music, because it can be easily “drown” the music if I add too many notes. Especially the many cross rhythms was quite difficult to play, because you have to be very precise or else the rhythms will fall easily apart.</p></blockquote><p>Animenz最终理解的改编主题是”Echo”：</p><blockquote><p>It is hard to believe, but this song actually consists of only two harmonic progression patterns, which is repeating itself over and over again. If I had to use one word to describe the mood of this song, it would be “Echoes”.</p></blockquote><p>可以说这个理解相当精准，Animenz用并不算非常复杂的和弦编排巧妙营造了循环与回响的氛围，听罢之后仍觉得余音绕梁不绝于耳。此外Animenz高超的左右手分奏能力也极好地凸显了各自的节奏感。</p></section>
<section><h2>No.18 Euterpe<a href="#no18-euterpe"><span>#</span></a></h2><p>出自动漫《罪恶王冠》。</p><p>先聊几句Animenz和《罪恶王冠》的故事 - 整部《罪恶王冠》中诞生了诸多经典配乐，Animenz本人相当喜欢这些曲目，因此倾注了大量心血进行改编，使得《罪恶王冠》的几首改编作品质量都相当之高。</p><p>这首改编是Animenz的早期作品，因此充满了浓厚的古典演奏技法，Animenz对原曲旋律进行了大量的改编，使得改编版本的情感表达极其强烈，但却又并不违背原曲的主题。此外，从第二段开始Animenz引入了演奏技巧，例如三手技巧、大量高速的和弦拆解跑动、三连音八度等等，Animenz认为这些技巧的尝试为他之后几年的其他改编提供了许多灵感：</p><blockquote><p>It is also the first arrangements where I am utilizing the three-hand-technique (starting in 2&lt;32&gt;): the left hand is playing the melody and the bass, while the right hand is playing an accompaniment.</p><p>Thinking back, it’s one of the prototypes for my future “orchestral” arrangement style and an important personal milestone.</p></blockquote></section>
<section><h2>No.17 悪魔の子<a href="#no17-悪魔の子"><span>#</span></a></h2><p>出自动漫《进击的巨人》。</p><p>又是一首左右手交替主旋律 + 三手技巧的经典改编，还原感十足。副歌部分在琶音凸显丝滑的同时，主旋律仍能保持洪亮的听感。而4分钟处的A moment of silence，堪称Animenz原创的神来之笔：</p><blockquote><p>I added an extended “epilogue” in 3&lt;57&gt; to bring the chapter Attack on Titan to a proper closure. The melody is slowing down and seems to almost disappear in 4&lt;29&gt;, reflecting Eren’s fate in Attack on Titan. And at the very end in 4&lt;33&gt;, I played the intro melody again but this time in a major key, to give all the characters of Attack on Titan a proper send-off.</p></blockquote></section>
<section><h2>No.16 Only my Railgun<a href="#no16-only-my-railgun"><span>#</span></a></h2><p>出自动漫《某科学的超电磁炮》。</p><p>这首改编可以说是Animenz的“开山之作”：</p><blockquote><p>Only my Railgun was actually the first arrangement I have ever created, in November 2009 to be exact. I was running an Anime blog, writing anime reviews and sharing my anime piano arrangements, before I decided to create my own YouTube channel 2 months later in January 2010.</p></blockquote><p>尽管因为欠缺演奏技法和改编经验，初版的效果不佳并被Animenz视为失败作品，但在之后的六七年中Animenz也因此有了动力精益求精，终于在2016年他完成了目前为世人所知的这个版本的改编。整首改编对于原曲旋律的还原度相当之高，同时也解决了Animenz在六七年前最困扰的多手演奏问题。借鉴动漫里的设定，这首改编对我而言就像”Level Upper”一样，总能在心情低沉时点亮我的情绪。</p></section>
<section><h2>No.15 スパークル<a href="#no15-スパークル"><span>#</span></a></h2><p>出自动漫《你的名字》。</p><p>要理解这首改编必须对《你的名字》这部电影需要有一定的了解。在电影中这首曲子出现于高潮时刻（彗星坠落至地球），因此改编的版本需要有一定的故事性，和电影中这一段的人物情节对应上。Animenz对此的理解是“Connected”：</p><blockquote><p>Since the central topic of the movie was “being connected to each other”, I tried to represent it in the music as well. If you listen closely, you will notice that there are many times, where the “voices” of Taki and Mitsuha are collaborating with each other.</p></blockquote><p>由此便能感受到Animenz编曲的精妙之处了。无论是左右手交替主旋律对应男女主角彼此的呼唤，亦或是原创的长篇幅情感积蓄后的迸发，都令人听后欲罢不能。4分20秒处改编的再现部尤其精髓 —— 一连串和弦之后重新回响起的旋律完全将我再次拉回了电影情节，完美对应了电影中立花泷张开手掌，看到了三叶留下掌心里的“すきだ”的画面，有一种苦尽甘来，雨过天晴的感动。</p></section>
<section><h2>No.14 Key anime piano medley<a href="#no14-key-anime-piano-medley"><span>#</span></a></h2><p>出自Key社的若干动漫，包括《AIR》《Kanon》《Clannad》。</p><p>Key社的这几部动漫都是二三十年的经典之作，配乐也都经历了年代考验流传至今。Animenz的组曲改编还原了原曲的精髓，尤其是开场的鸟之诗，在和弦的选取和琶音的搭配上堪称完美，C段部分仿佛让听众看到了一只自由之鸟张开双翼飞上天空。</p></section>
<section><h2>No.13 aLIEz<a href="#no13-aliez"><span>#</span></a></h2><p>出自动漫《Aldnoah.Zero》。</p><p>“核爆神曲”一直以曲风激昂，节奏感强烈闻名，而这对钢琴改编是一个极大挑战。Animenz在改编中提供了一个思路：让左手与右手独立开来，以重复、低沉、快速、规律的左手伴奏模拟原曲中强节奏感的鼓声。尽管左右手的节奏相对独立，但Animenz并没有让多声部顾此失彼，而是通过切分音等技巧，既维持了很强的节奏感，又能时刻突出当前篇章中的主旋律。</p><p>这首改编最打动我的地方在于2分54秒开始的右手八度主旋律，几乎总能令我产生鸡皮疙瘩。相较于原曲，Animenz将这段右手的旋律提高了八度，效果却异常地出众 - 在高音之下是持久的，濒临绝望却又坚持不能倒下的壮烈感。</p></section>
<section><h2>No.12 Call of Silence<a href="#no12-call-of-silence"><span>#</span></a></h2><p>出自动漫《进击的巨人》。</p><p>这首改编又是Animenz的在情绪铺垫与累积上的一大经典之作。原曲的时长其实很短（2分50秒左右），因此Animenz在改编大胆将前3分钟都变成了一个引子，用相对平静的节奏完成了对原曲的复奏。然而从3分21秒开始，Animenz插入了急速的音阶进一步堆叠情感，并终于在3分56秒的主旋律再现时达到了重生的巅峰 —— 每次听到这段再现部时我都会被伴奏部分如同钟声一般的洪亮和弦重击所深深震撼。而在5分钟之后的结尾部分，Animenz用回归空灵的编曲完成了重生之后的道别。</p></section>
<section><h2>No.11 Butter-Fly<a href="#no11-butter-fly"><span>#</span></a></h2><p>出自动漫《数码宝贝》。</p><p>这首曲子原曲是动漫界多年的金曲，但是Animenz改编出了属于自己的特色 —— 前半部分的叙事风格拼接后半部分的摇滚风格。从4分14秒开始的“無限大な夢のあとの”阿卡贝拉变奏更是全曲的点睛之笔，尽管挪去了左手伴奏，但是右手的和弦高亢响亮，仿佛令人听到了和田光司发自肺腑地嘶吼演唱，令人动容。</p></section>
<section><h2>No.10 One more time, One more chance<a href="#no10-one-more-time-one-more-chance"><span>#</span></a></h2><p>出自电影《秒速五厘米》。</p><p>我愿称之为Animenz最具画面还原力的改编作品。2分00秒至2分31秒右手的伴奏堪称神来之笔，闭上眼睛仿佛就能看到片片飘落的樱花花瓣；而4分钟之后的双手琶音交叉，仿佛让人看到了电影结尾电车交汇的场景。当时看完电影的我有一种强烈的钝痛感以及无法言语的苦涩，而Animenz的改编还原了这种体会，在静默中渐行渐远。</p></section>
<section><h2>No.9 Sincerely<a href="#no9-sincerely"><span>#</span></a></h2><p>出自动漫《紫罗兰永恒花园》。</p><p>Animenz的这版改编娓娓动人，非常契合《紫罗兰永恒花园》细腻、温柔的情感主题。Animenz在这首改编中引入了大量多声部设计，并且精心设计了数段长时间的伴奏修饰音阶，保证节奏的流动性的同时也能更好地和动漫中的主角薇尔莉特故事呼应 - 不同的声部构造而成的主旋律，更能描绘出薇尔莉特这一段悲喜交加、充满起伏的情感旅程。</p><p>同时这首改编发布于京都动画纵火案一周年，因此Animenz无缝衔接了一个长达三分钟原创篇章表达了对京阿尼罹难员工的悼念。这段原创可谓画龙点睛之笔，既在旋律上契合了前五分钟的Sincerely原曲，又仿佛讲述了一个京阿尼浴火重生的故事。用Animenz本人的话来总结便是：</p><blockquote><p>Initially, the music would have ended here, but I wanted to include a more positive message in my tribute. I believe there is still hope and that KyoAni will return one day. The right hand plays the main theme A-C-G-A again but this time it’s a little bit hidden within the chords. The violin tremolo is returning as well and the music is swelling up until it finally unleashes a bright and optimistic F-Major chord. It symbolizes the rebirth of KyoAni, where it slowly rises from the ashes, only to shine brighter, than it ever has.</p></blockquote></section>
<section><h2>No.8 βios<a href="#no8-βios"><span>#</span></a></h2><p>出自动漫《罪恶王冠》。</p><p>βios原曲自从当年动漫问世之后就一直以“拔剑神曲”著称，而Animenz的改编完全还原了原曲的风味。在2012年的初版改编中，Animenz就已经完美还原了原曲的激昂摇滚元素；而在2021年的再版改编中，Animenz在初版基础上添加了更多的声部演绎，让整首改编的情感更加丰富饱满，甚至隐隐有一种“悲从中来不可断绝”的感觉。</p><p>值得一提的是，初版改编的调号基于的是原曲的c小调，而再版改编的调号则更换为了升f小调，以此和泽野弘之在《罪恶王冠》十周年纪念时发布的升f小调版本同步。（十分有趣的是，Animenz承认这个调号改变让他更容易在KTV演唱这首歌曲。。）本已十分熟悉c小调版本的我在听到升f小调新版时的确有一种耳目一新的感觉。</p><p>回到改编本身，Animenz的再版改编相较于初版大幅增加了长度，拥有了长达2分多钟的引子和接近1分钟的后记，结构上更加完整。此外在初版旋律再现的部分中，Animenz用这些年更加精进的多手演奏技巧去贴近原曲的旋律：</p><blockquote><p>Compared to my old “Bios” arrangement from 2012, I realized that my tendency to use three-hand techniques has exponentially risen with every year. With other words, this “Bios” remake is a true paradise for all three-hand technique lovers and I tried to replicate the background instruments of the original song as much as I can. They are most noticeable in the guitar solo in 2&lt;48&gt; and in the chorus 3&lt;55&gt;.</p><p>The most difficult part to arrange was definitely the double voice climax in 4&lt;34&gt;. Technically, it’s even a 4-hand technique, because the right hand is playing the main melody and an ornamental figure while the left hand is playing the sub melody and the bass.</p></blockquote></section>
<section><h2>No.7 Ninelie<a href="#no7-ninelie"><span>#</span></a></h2><p>出自动漫《甲铁城的卡巴内利》。</p><p>这首改编和原曲风格迥异，却出人意料地抓耳。原曲中”F#3 C#4 F#4 B3 F#3 B3 C#4 E4”的固定音型(Ostinato)被恰到好处地通过多声部 + 左右手交替主旋律复刻进了改编；而第一次进入副歌时的高八度轻处理比起原曲更增添了一种空灵的奇幻感；结尾部分主旋律再次回归左手的同时，右手转变为了高速的跑动，这一部分双手演绎出了截然不同的风格 - 左手厚重的同时右手轻巧灵动，最后还能完美归一，真有种“尘归尘，土归土”之后的六根清净。</p></section>
<section><h2>No.6 君の知らない物語<a href="#no6-君の知らない物語"><span>#</span></a></h2><p>出自动漫《化物语》。</p><p>一直以来Animenz对于Ryo就极为推崇。《君の知らない物語》作为Ryo的经典编曲作品之一，Animenz毫不吝啬对其的赞赏：</p><blockquote><p>Did I also mention that Supercell is one of my favorite J-pop bands of all time? Ryo is seriously amazing for composing all these timeless melodies. I think I have listened to this piece more than a hundred times already, and I still get goosebumps while listening the chorus.</p></blockquote><p>而这首改编也开创了Animenz“交响式编曲”的先河，相比起早期改编作品中更加注重古典式演奏技巧，Animenz开始更多地侧重改编的旋律性，用更多的声部、更丰富的和弦设计、更连贯的篇章来体现音乐的“流动性”(natural flow of music)。这个改编思路对于《君の知らない物語》相当契合，Animenz几乎做到了对原曲的极致还原，每一次我聆听的时候都能感受到旋律的细腻，以及琴声之后充满欢笑又带有遗憾的青春回忆。</p></section>
<section><h2>No.5 Unravel<a href="#no5-unravel"><span>#</span></a></h2><p>出自动漫《东京食尸鬼》。</p><p>这首改编可以说是Animenz最为人们熟知的一首改编，截止2026年中，Youtube上已有超过1亿次播放。作为Animenz的代表作，整首改编基本融合了他能想到的所有高难度演奏技巧，并且以极高的还原度复刻了原曲狂放的旋律，听罢令人酣畅淋漓。</p><p>我个人也曾花费相当长的时间练习这首改编，但惭愧的是至今也只能演奏出简化版本。全曲最大难点当属贯穿左手部分的和弦分解伴奏，需要在高速跑动的同时兼顾跨越数个音域的准度；其次就是右手部分的各种主旋律变奏，尤其是需要依靠无名指/小拇指强调高音的部分，十分考验四五指的基本功，甚至是多声部的理解驾驭能力。除此之外，遍布整首改编的各种修饰音、颤音、同音换指等高阶技巧中任意一项都需要演奏者具有极深的演奏基本功。</p><p>有趣的是，Animenz本人似乎也在日后回顾这首改编时觉得应该降低一些难度：</p><blockquote><p>In hindsight, if I would arrange this song again, I would use my gained experience from the past five years to make it less frustrating to play, but without losing its musical quality.</p></blockquote></section>
<section><h2>No.4 The Everlasting Guilty Crown<a href="#no4-the-everlasting-guilty-crown"><span>#</span></a></h2><p>出自动漫《罪恶王冠》。</p><p>这首改编完美地还原了原曲背景声部一直循环的Ostinato - Animenz甚至将它塞进了三个声部。除此之外，Animenz调整了编曲中的段落结构，减少了重复的篇章，使得全曲听起来更加一气呵成。从4分55秒开始至结尾的华彩部分更是精华中的精华，融合了诸多技巧，用Animenz本人的描述是：</p><blockquote><p>In this short moment, I was reflecting all the past arrangements I have created, all the struggles I had to go through in order to continue and my constant obsession with perfectionism. So I utilized everything I could think of to make the final chorus count, be it three hand technique, fast right hand runs, or multiple voicing.</p></blockquote><p>初次听完这段华彩部分的我真的有一种想从椅子上坐起的冲动，我知道这段旋律在我脑海中也将成为”everlasting”了！</p></section>
<section><h2>No.3 グランドエスケープ<a href="#no3-グランドエスケープ"><span>#</span></a></h2><p>出自动漫《天气之子》。</p><p>进入排行榜前三名的改编在我心中都达到了一个新的境界 - 超越了原曲。原曲本身已经十分精彩，然而Animenz的改编却给予了我原曲之外全新的聆听感受。</p><p>这首改编几乎始终维持在三或四声部，可以看出经过多年历练后，Animenz对于多声部的理解和掌控能力已至化境。与之对应的自然就是演奏难度的大幅提高 - 演奏者必须有极强的左右手分奏能力和协调能力。</p><p>然而真正让我觉得这首改编超越原曲的地方在于最后一分钟，可以说在此之前的三分半是一个大型铺垫，一切都是为了最后一分钟的情感迸发做足准备。对应《天气之子》的剧情而言，原曲这一段配乐发生在剧情高潮之时（男女主角逃离天空祭坛，降落回地面重获自由）；而Animenz的改编用极为高超的编曲将这一段画面生动描绘出来了。用他本人的介绍是：</p><blockquote><p>The climax in 3&lt;42&gt; I really wanted to include that cheerful hand clapping from the original music into the piano, so I used the three hand technique again to let the right hand play the CLAP CLAP CLAP. This is one of the few times, where the left hand is literally going all out and play the most glorious forte fortissimo ever!</p></blockquote><p>诚如其所言，改编的高潮部分充满生机、梦幻，既有重获自由的喜悦，又有对未来生活的向往。此刻我的脑海里只剩下天野阳菜那句经典台词“ねぇ、今から晴れるよ!”，这种雨过天晴的幸福不是通过祈求上天得来的，而是自己拼命换来的，唯有这种幸福才是人类最宝贵的力量。</p></section>
<section><h2>No.2 カワキヲアメク<a href="#no2-カワキヲアメク"><span>#</span></a></h2><p>出自动漫《家有女友》。</p><p>我在初次听罢这首改编之后惊叹到失语，同时我也庆幸借着这首改编认识了美波这一位才华横溢的歌手。美波的原曲演绎几乎已经是完美的了，她歇斯底里、悲怒交杂的招牌唱腔让这首歌极具感染力，而Animenz不仅将这种感染力带到了钢琴上，甚至还在此基础上进一步丰富了旋律编排，令我真正领会到了“钢琴的怒吼”。</p><p>Animenz本人将这首改编视为Unravel的“精神续作”：</p><blockquote><p>It’s hard to explain, but this song feels like a “lost twin” of another song: “unravel” from “Tokyo Ghoul”. The similar chorus melody, the similar chord progression, the similar song structure with the “soft” part at the beginning - the similarities are astonishing.</p><p>Before I started to arrange this song, I actually practiced many of my old piano arrangements again in order to re-learn my “old arrangement style” (which focuses a lot on piano technique). And similar to my “unravel” piano arrangement, I am also utilizing many notes from the high register of the piano to create a cold - and lonely - atmosphere. I am pretty sure you can hear many similar sections between these two arrangements.</p></blockquote><p>我个人则认为这首改编的难度甚至在Unravel之上，因为它不仅继承了Unravel之中的诸多难点，对于多声部演绎的要求也要高出不少；尾奏部分更是难度极高，还原了原曲的多种乐器组合演绎。Animenz花了接近其他曲子三倍的时间来改编这部作品，然而这样呕心沥血的改编并不是单纯炫技，正如前文所提他希望用这种方式真正让钢琴“怒吼”起来，以此让观众更好共鸣。他也确实做到了，这首改编是我心目中最为接近“一个人就是一支乐队”的典范。</p></section>
<section><h2>No.1 My Dearest<a href="#no1-my-dearest"><span>#</span></a></h2><p>出自动漫《罪恶王冠》。</p><p>这首改编无论对于Animenz还是我本人都有极为深刻的意义。</p><p>对于Animenz而言，他先后为My Dearest出过两个版本的改编，初版是其早期的经典代表作，用Animenz自己的话形容是“my most ambitious fusion between the world of classic and pop”；而再版则特意选择了YouTube首次投稿十周年纪念日当天发布，在保留了初版的绝大部分风味的情况下润色了部分旋律编排和修饰音处理。两首改编基本可以视为一脉相承的一个整体，Animenz也希望借此传达自己不忘初心的想法，以及对所有人的致谢：</p><blockquote><p>With the 10th anniversary around the corner, I knew exactly which song I would upload: “My Dearest” - the OP song of Guilty Crown. Because back in 2013, when I was having a dark time period in my life, this was the piece that showed me the possible future of Anime piano. It was an experiment, a prototype for a new type of music: By combining classical music elements with Japanese anime music, I have managed to create something new on my own.</p><p>Without this piece, “Animenz” wouldn’t be what it is today.</p></blockquote><p>而对于我个人而言，这首改编的意义就更特殊了。这是我接触的第一首动漫歌曲改编，彼时我对整个二次元领域所知甚少，对钢琴曲的理解更是几乎全部局限在古典乐和少数近现代流行乐上，这首改编完全为我打开了新世界的大门。同时如歌名My Dearest所指，这首曲子是献给至爱之人的，我至今也难以忘记向伴侣初次演奏这首曲子时内心的忐忑与悸动。每次练琴时，我都会尽可能用最认真的状态演奏一遍My Dearest，用哈利波特中的那句经典台词来形容这首改编再合适不过了：“After all this time?” “Always.”</p><p>回到这首改编本身，我至今仍认为这是Animenz编曲的巅峰，将原曲中原本相对激昂的摇滚元素完美转变为了细腻、婉转的叙事曲风格。尽管在Animenz的一众改编里，从演奏难度而言它不一定是最难的，但它有着无与伦比的旋律美感。即便听了多年之后，每次重新播放之时我仍然像第一次听到时被打动。我尤其倾醉于这首改编中的和弦拆解 - 我第一次领会到这种近似练习曲的演奏技法能带来这样优美的旋律，这在之后很多年内都影响了我的音乐观。</p><p>感谢Animenz能为世人奉献这样精彩的作品。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2023-12-31-2023%E5%B9%B4%E7%BB%88%E6%B8%B8%E6%88%8F%E7%9B%98%E7%82%B9/</id>
      <title type="text">2023年终游戏盘点</title>
      <published>2023-12-31T00:00:00.000Z</published>
      <updated>2023-12-31T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2023-12-31-2023%E5%B9%B4%E7%BB%88%E6%B8%B8%E6%88%8F%E7%9B%98%E7%82%B9/"/>
      <summary type="text">2023年的最后一天，回顾今年每一个新玩的游戏🎮</summary>
      <content type="html"><![CDATA[<p>2023年的最后一天，回顾今年每一个新玩的游戏🎮</p>

<section><h2>前言<a href="#前言"><span>#</span></a></h2><p>2023年是游戏业界的大年，不管是全新大作还是冷饭翻炒重制都不乏精彩之作；而今年我恰好又用年终奖升级了PC设备，接触到的游戏面因此比之前更加宽广。以下将按照今年游玩的时间月份顺序，试图用三言两语概括每一个新玩的游戏，也算是纪念这不平凡的一年。</p></section>
<section><h2>列表<a href="#列表"><span>#</span></a></h2><section><h3>火焰纹章：结合<a href="#火焰纹章结合"><span>#</span></a></h3><p>2023开年游玩的第一作。作为上一代风花雪月的忠实玩家，本作我早早预购，到手之后游玩了接近150小时。这一代优缺点都十分明显，战斗方面相比前作有了显著提升，更需要动脑；但剧情人设构造则过于幼稚，远不如前作刻画得细腻。从我个人角度来看，毕竟火焰纹章是一款战棋游戏，战斗策略方面仍然是更贴近游戏核心的部分，而且遇到剧情动画实在乏味之时跳过即可，因此总体来说我还是比较满意本作游玩体验的。</p></section><section><h3>女神异闻录4：黄金版 (P4G)<a href="#女神异闻录4黄金版-p4g"><span>#</span></a></h3><p>P4G今年年初登陆了次世代主机，尽管游戏画面、玩法还是十年前的古早风味，但沉迷程度完全不输P5，在剧情、人物刻画方面甚至还超过了它的后代。我个人而言也更喜欢P4G的故事，相比起P5略显压抑的剧情，P4的色调更加阳光，对于青春的理解和刻画也更加到位。值得一提的是，本作改编的番剧P4A和P4GA也是良心之作，即便是没有玩过游戏的观众也能轻松入坑，这也要归功于P4本身的精彩剧情。</p></section><section><h3>鹅鸭杀<a href="#鹅鸭杀"><span>#</span></a></h3><p>公司团建时接触的游戏。作为此类游戏新手，我并没有什么游戏体验，扮演鸭的时候基本都被早早识破，而扮演鹅的时候则经常沦为炮灰被人暗杀。我认为此类游戏的乐趣在于如何拿捏人与人之间的信任 - 如何伪装自己骗取他人信任，亦或是在人人自危时赢得他人信任。</p></section><section><h3>女神异闻录4：无敌究极后桥背摔<a href="#女神异闻录4无敌究极后桥背摔"><span>#</span></a></h3><p>P4G的后日谈。优点是添加了大量原创剧情，并且加入了P3的人物共同互动；而缺点是剧情质量不如游戏本体，并且几乎没有动画，演出效果大打折扣。而作为游戏本体核心玩法的格斗也并没有太大亮点，甚至让玩家无法分析出不同人物之间的角色强度。总结来说是一部只适合打折购入的粉丝向作品。</p></section><section><h3>宝可梦：朱<a href="#宝可梦朱"><span>#</span></a></h3><p>宝可梦第九世代之作，尽管Game Freak技术力仍然是肉眼可见的二流，但好在相比以前还是有些进步的，经过之前剑盾 + 阿尔宙斯的试水之后渐渐也将开放世界宝可梦玩明白了。总体而言，本作主线剧情演出中规中矩，优化有进步空间但不妨碍玩家正常通关。它的技术力展示似乎并不太配得上千万级销量，但它确实又是有史以来最“开放”“新颖”的宝可梦，单就这一点已经足够让世界上众多宝可梦玩家入坑了。</p></section><section><h3>塞尔达传说：王国之泪<a href="#塞尔达传说王国之泪"><span>#</span></a></h3><p>这一作实在不需要过多介绍，只能说没有拿下年度游戏实在是生不逢时，遇上了博德之门3这样的怪物，但从游戏质量本身来说它绝对还是游戏业界标杆。我个人可以给本作打98分，扣掉的两分里一分是因为switch的性能实在是限制了这一作的上限，另一分是因为我思念米法了。</p></section><section><h3>逆转裁判123：成步堂精选合集<a href="#逆转裁判123成步堂精选合集"><span>#</span></a></h3><p>卡普空的经典冷饭，文字推理类游戏的标杆。制作人巧舟的剧本本身已经足够精彩，基本上每一代的最后一章都能达到一个小高潮，第三代的最后一章《华丽的逆转》更是回收了此前章节的几乎所有伏笔，为整个123合集完美收官。此外，在20年前极为有限的存储容量环境下，制作组用并不丰富的素材、配乐就完成了对剧情人物的生动演绎，诸多动漫、游戏都在后来致敬了逆转裁判里的演出桥段。</p></section><section><h3>剑侠情缘网络版三<a href="#剑侠情缘网络版三"><span>#</span></a></h3><p>今年短暂入坑了这款堪称国内生命力最旺盛的网游，两周多的时间内体验有好有坏。在我看来这款网游的生命力源泉在于高度粘性的玩家群体，其中有相当一部分玩家保持着高素质，这给予了新玩家融入的可能。以我的个人经历为例，我在一无所知的情况下进入一个副本之后频繁迷路，队长愿意停下来手把手教导我如何跑图，同时安抚其他队友让他们耐心等待，将心比心换成我是队长未必做得到如此耐心。然而与此同时，剑网3依然没有办法挣脱传统网游的束缚：金钱 / 时间二选一提升角色。剑网3的选择是时间，并且还设计了类似赛季的机制，保证老玩家永远有新的奋斗目标，新玩家也有追赶的可能。但这样一来，人物的属性也就高度绑定于在线频率；而为了规避工作室影响，官方也在每周资源获取上施加了诸多限制，这就让人物培养周期变长了很多。我相信对于有着大把时间、不愿氪金的玩家来说这是最好的方案，但对于我这类上线时间有限且不规律的上班族来说就比较痛苦了。</p></section><section><h3>异度神剑3<a href="#异度神剑3"><span>#</span></a></h3><p>JRPG的又一标杆之作，在世界观塑造上独具一帜，对于生命的讨论非常有深度。角色塑造张力十足，中后期不少半小时以上的剧情播片并不令玩家出戏，并且还有诸多精彩反转。然而总体而言游戏节奏还是略显拖沓，特别是战斗中引入卡牌策略机制我并不太喜欢，反馈不够强烈并且非常拖时间。</p></section><section><h3>吸血鬼幸存者<a href="#吸血鬼幸存者"><span>#</span></a></h3><p>有意思的刷子游戏，尽管画质十分简陋，但是装备组合、地图设计却异常丰富，让人有玩下去的动力。各种各样的彩蛋、隐藏机关设计也十分令人惊喜。</p></section><section><h3>赛博朋克2077<a href="#赛博朋克2077"><span>#</span></a></h3><p>发售三年后的2077终于迎来了完全体 - 修好了大多数bug并且推出了往日之影DLC，再结合打折，正是最好的入手时机。完全体的游戏质量绝对是达到三年前玩家们的预期的，无论是剧情人物的塑造、角色培养、战斗操作等等都是业界标杆级别。</p></section><section><h3>生化危机4重制版<a href="#生化危机4重制版"><span>#</span></a></h3><p>卡普空的另一碗经典冷饭，整款游戏玩下来可以用两个词总结：“舒服”和“良心”。“舒服”体现在游戏的各类细节和交互上，没有一丝一毫多余的设计，制作组很清楚玩家会干什么，想要干什么。而“良心”则体现在重制的力度上，重制版相比起原版并不仅仅是画质的巨大提升，对剧情、人物的塑造也有了更合理的改动，让玩家更有沉浸感。值得一提的是，这款游戏虽然是一个线性通关游戏，但因为巧妙的动态难度设计，玩家即便通关一次之后选择新难度开启二周目，也能获得全新的游戏体验，无论是资源的获取、战斗的方式等等都需要重新规划，这也体现出了制作组制作功力之深。</p></section><section><h3>八方旅人2<a href="#八方旅人2"><span>#</span></a></h3><p>我个人认为这是一款言过其实、游玩体验高开低走的游戏。游戏配乐堪称这款游戏最大的亮点，诸多玩家戏称花了几百元买了一个内置音乐播放器并非浪得虚名。游玩体验上，前期开荒阶段十分精彩，尤其是不同角色日夜的个人技能运用带来了非常高的自由度，隐隐让我联想起了上古卷轴5。然而中期开始随着玩家队伍配置成型，怪物似乎并没有相应的提升，玩家无法感受到足够的挑战性。而且频繁的暗雷遇怪模式也让跑图体验磕磕绊绊，难以让玩家保持投入。此外八个角色之间的互动依然比较有限，这也或多或少影响了玩家的代入感。</p></section><section><h3>幽灵诡计<a href="#幽灵诡计"><span>#</span></a></h3><p>巧舟的另一款推理解谜游戏，他的剧本质量水准依然相当之高，无论是穿插的幽默、伏笔和照应以及出色的人物塑造都让人印象深刻。尽管我对这款游戏的美术、操作风格并不那么喜欢，但精彩的剧本依然让我有很强的动力通关。</p></section><section><h3>FC24<a href="#fc24"><span>#</span></a></h3><p>年货游戏，今年不幸丢了FIFA的冠名权，本以为改名是个好的契机让制作组能稍微用心做一些新内容，但很可惜作为单机玩家而言，最终玩到的成品并没有太大改变。不过打折时购入还是差强人意的，偶尔放松踢上一把十分解压。</p></section></section>
<section><h2>后记<a href="#后记"><span>#</span></a></h2><p>No game, no life。希望2024年我能接触到更多精彩的游戏作品，点缀一下乏味的打工生活。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2022-12-26-%E5%A5%B3%E7%A5%9E%E5%BC%82%E9%97%BB%E5%BD%955%E7%9A%87%E5%AE%B6%E7%89%88%E6%B8%B8%E7%8E%A9%E5%BF%83%E5%BE%97/</id>
      <title type="text">女神异闻录5皇家版游玩心得</title>
      <published>2022-12-26T00:00:00.000Z</published>
      <updated>2022-12-26T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2022-12-26-%E5%A5%B3%E7%A5%9E%E5%BC%82%E9%97%BB%E5%BD%955%E7%9A%87%E5%AE%B6%E7%89%88%E6%B8%B8%E7%8E%A9%E5%BF%83%E5%BE%97/"/>
      <summary type="text">Take your heart!</summary>
      <content type="html"><![CDATA[<p>Take your heart!</p>

<section><h1>前言<a href="#前言"><span>#</span></a></h1><p>今年Atlus决定将女神异闻录5：皇家版(Persona5 Royal，以下简称P5R)推向全平台，包括我在内的大批新玩家因此有机会入坑了这部JRPG名作。它不止治好了我这几个月里的电子游戏羊伟，更给予了我诸多思考的机会。近年来电子游戏逐渐快餐化与公式化，能让人驻足思考剧情与设定的游戏并不多见，这也是我在经历了约166小时三周目的游玩之后想分享一些P5R心得的原因。</p></section>
<section><h1>荣格心理学<a href="#荣格心理学"><span>#</span></a></h1><p>P5R乃至整个P系列的设定都主要建立在荣格心理学理论之上，借此游玩机会我也有幸学习了一些荣格的经典理论。</p><section><h2>人格面具<a href="#人格面具"><span>#</span></a></h2><p>一个人的人格可以视为若干面具的集合，同一个人在不同的社交场合下会表现出不同的形象（戴上不同的面具），用俗话形容就是“见人说人话，见鬼说鬼话”。这个理论很好理解，多重面具的切换能力对每个人都是必要的，我们需要借此融入形形色色风格迥异的社会场合。在游戏中，主角Joker就能自如地持有并切换多重面具，这一能力让他和不同背景、性格的协作人结交时左右逢源、事半功倍；同时在面对不同的暗影（本质上也属于面具的一种另类衍生）时也能轻松攻其软肋。</p><p>然而，人格面具会导致自我与他人的界限变得模糊，随着自我的主体性逐渐消失，个人内心的原始冲动以及欲望都将被面具压抑。这时就需要灵活掌控人格面具，使其不能压抑自我本能。P5R中重要的“人格面具觉醒”设定实际就是一个掌控人格面具的过程，主角团中的所有人都在某个机缘巧合之下被社会迫害，陷入了愤怒的绝境中，此时心中的本我爆发，和人格面具达成了契约之后（我は汝，汝は我），就能真正学会如何掌控面具，在需要摘下面具的时候（象征着遇到逆境）能随时摘下来。这也是为什么所有人第一次人格面具觉醒的时候，一定会有一个撕下自己面具的动画特写。在此之后主角团不会再被面具压抑本能；相反人格面具成为了他们叛逆意志的象征，由此能完全释放自身的反抗力量。</p></section><section><h2>个体无意识 vs 集体无意识<a href="#个体无意识-vs-集体无意识"><span>#</span></a></h2><p>所谓个体无意识，指的是个体层面所有同“自我意识”不一致或者有矛盾的内容，游戏中的几个殿堂均是由个体无意识演变而来的扭曲欲望空间。值得一题的是，引发这种扭曲的事物本身可能是无害的（例如鸭志田的奥运奖牌，班目的小百合画作），这个设定很有意思，很可能制作组想要强调个体无意识是由一个人的后天经历所影响的。</p><p>与个体无意识相对应的是集体无意识。荣格认为：</p><blockquote><p>精神的个人层终结于婴儿最早的记忆，而它的集体层却包含着前婴儿的时期，即祖先生活的残余…
集体无意识是相对于个人无意识而言的，它是人精神的一个构成部分，它是集体的、普遍的、非个人的由各种遗传力量形成的心理倾向或种族记忆。</p></blockquote><p>游戏中的印象空间大致复刻了集体无意识的框架，本质上是所有民众心中的欲望集合而形成的巨大殿堂。印象空间每一层大空间都象征着一种人类美好品德被剥夺（思想、和谐、节制、美德、慈悲、感动、宽容，与人类的七宗罪相呼应）；而集体无意识膨胀形成的圣杯象征着宰制人类欲望的最终产物。在P5R的设定中，伪神通过控制圣杯进而主宰了民众的思想，怪盗团因此不可避免地将悔改对象变成了全社会的民众。令人叹息的是，在游戏中有怪盗团弑神唤醒民众的热血桥段，但现实中或许永远无法有人能真正解放民众的集体意识。</p></section></section>
<section><h1>人物群像塑造<a href="#人物群像塑造"><span>#</span></a></h1><p>P5R塑造了20多位性格特异的协作人(cooperation，以下简称coop)，有些是主角团患难与共的战友，有些是社会上遇到的志同道合的同志，甚至还有来自精神空间的支援。制作组刻画如此众多的人物时并没有顾此失彼，而是成功塑造了精彩的人物群像。每个coop都有十个等级，绝大多数情况下每个等级都需要一个事件+若干对白推动，但P5R安排的coop关系推进节奏十分舒服，让玩家并不对这200余次事件对话感到厌烦。每个NPC都被塑造的有血有肉，在提升coop的关系时还会解锁独特的能力，这些都增加了玩家推动coop发展的动力。以下聊聊我对几位印象深刻的coop的感触。</p><section><h2>摩尔加纳<a href="#摩尔加纳"><span>#</span></a></h2><p>本质上是来自天鹅绒房间的引导者，在主线故事中对于主角乃至整个团队也是名副其实的引路人。他无私传授了整个异世界的基础观念、战斗的技巧、秘宝的盗取、人格面具的使用等知识；并且在很长一段时间内还兼任了战斗中的导航以及车夫。作为一只猫，他原本可以只充当一只吉祥物划划水，但最后他对团队的贡献却远远超出了吉祥物所能做到的。</p><p>当然摩尔加纳也并不完美，他的性格和心态一直为部分玩家诟病。随着怪盗团的壮大，他的存在感似乎也在慢慢变弱，这让他心态逐渐失衡。然而这样的设定也让摩尔加纳的设定更加真实，因为他是一个尽职的前辈，也是一个有点“狂妄”的前辈；他为团队做出了贡献，因此也会眼红别人取代自己的角色。也正是经历了摩尔加纳的离队，其他团员们真正意识到了摩尔加纳的重要性；而回归后的摩尔加纳也最终排除了心魔重新融入了团队，找到了自己的价值。</p></section><section><h2>新岛真<a href="#新岛真"><span>#</span></a></h2><p>很多二次元作品里都有这样一个女角色，有能力有抱负，智商在线，内心强大意志坚定，但偶尔也能体现出反差萌激发男性保护欲，在P5R里这个角色就是新岛真。有趣的是，P5R并不是一开始就让新岛真就以完美的姿态登场，而是作为怪盗团的对立面暗中调查乃至干扰怪盗团。但在经过了诸多波折之后，她终于觉醒了自己的反抗意志，摆脱了成人们的操控，加入怪盗团走上了自己的人生道路。游戏投入了相当多的笔墨刻画了这一流程，足见制作者对这个角色下的苦心，而这样的苦心也收到了回报：在国内外几乎所有的P5R角色人气排行中，新岛真都稳居前三，赢得了诸多玩家的认可。</p><p>尽管P5R中主角有10位可以攻略的女性角色，但新岛真似乎是和主角最有CP感的角色，甚至制作组官方也通过游戏彩蛋体现了这种“偏心”，有意将她打造成官配：</p><ul>
<li>唯二和主角假扮男女朋友的角色（另一位是大宅一子）。与大宅的coop发展夹杂了成人世界的戏谑，相比之下与新岛真的这段coop关系却是真挚的日久生情</li>
<li>新岛真在主线剧情中惊慌失措时会抱住主角大腿，其他女角色没有类似待遇</li>
<li>白色情人节当天，选择其他女角色约会结束后主角会将她们送回车站，但新岛真并没有类似的文字提示，当天发生了什么我们不得而知</li>
</ul><p>当然彩蛋归彩蛋，我个人认为新岛真最适合成为主角伴侣的原因实际是职业规划。以主角杰出的人格魅力以及坚定的反抗意志，他在未来很有可能会步入政治/司法系统中，为民众的福祉而奋斗。在白色情人节事件中，所有女性角色都会提到一句“你不是为了自己，总是为了别人去行动”算是为主角的性格做了定性概括，也暗示主角可能未来会从事为别人奉献的事业。而在女角色中，新岛真的未来规划毫无疑问是和这个目标最为接近的，无论她进入律政系统还是司法系统，他们都将会有一个共同奋斗的目标。即便从coop事件中二人相处的日常模式来看，新岛真也没有很明显的性格缺陷，甚至还因为反差萌与主角相处得十分融洽，担当得起“官配”这样的角色。</p></section><section><h2>佐仓双叶<a href="#佐仓双叶"><span>#</span></a></h2><p>佐仓双叶算是全游戏除了主角之外对怪盗团最重要的角色。她的黑客技术深不可测，达到了人类巅峰水平。主线剧情中她有三个高光时刻：单人挫败梅吉多、远程调用异世界APP戏耍明智、侵入全日本电视信号发预告信，每一次高光时刻都能帮怪盗团扛过一次足以覆灭的危机，并且没有留下任何痕迹。至于日常窃听+窥屏获取情报，异世界的导航+辅助那都是额外附赠的能力了，在一众coop里她解锁的各项技能无一例外都是实用技能。古有“状诸葛多智而近妖”，双叶大概也算是这样的角色了吧。</p></section><section><h2>大宅一子<a href="#大宅一子"><span>#</span></a></h2><p>这位coop非常有意思，如果单纯以玩家人气作为标准，主角的十位交往对象中她几乎始终是人气最低的那位。造成这一现象的原因也很好列举，颜值无亮点、年龄大、生活方式不健康、coop技能作用低…然而在完整推完了她的coop后，我却对她充满敬佩。</p><p>大宅是废人化事件的间接受害者，她的好友因为查出了关键证据惨遭报复，变成废人；大宅本人也因为相关的新闻报道受到牵连，被迫放弃调查，在领导的威逼下她不得不成为了一名花边新闻专栏记者。事业的压力、好友的遭遇无时不刻摧残着她的精神，可她却连倾诉的对象都没有，只能借酒浇愁，并在酒后对着酒吧老板吐露苦水。幸运的是，在遇到主角之后她又燃起了斗志，勇敢地为怪盗团提供情报，并且顶着上司的压力继续调查废人化事件。在主角因为前科入狱后，也是她找到了主角老家的当事人，提供了一手最能直接推翻前案的证据，帮助主角沉冤昭雪。</p><p>虽然大宅在外貌上不那么吸引人，但实际上她为主角提供的帮助相当慷慨。同时她也是相当契合P5R反叛精神的角色，在与主角的交往中，她也渐渐找回了自己的意志，与社会的黑暗战斗。</p></section><section><h2>丸喜拓人<a href="#丸喜拓人"><span>#</span></a></h2><p>丸喜拓人是P5R新加入的角色，制作组借这个角色抛出了另一个问题供玩家思考：我们是否应该逃避现实中真实的痛苦，沉迷于虚假的幸福？</p><p>本质来说，丸喜在怪盗团干掉伪神之后取而代之，成为了虚拟新世界的掌控者。按丸喜的设定，所有人都能在这个世界中避开痛苦取得幸福，并且为了使主角信服，他还让主角亲眼看到了其他队友沉溺于美好世界中的样子。然而稍想一下便知丸喜画的大饼有着诸多漏洞：如何保证不同人之间的幸福互不冲突？如何保证丸喜能精准定义每个人的幸福？如何保证丸喜日后不改变心愿，从营造幸福变为制造不幸？</p><p>于是问题出现了：为什么丸喜这样一个漏洞百出的设定能俘获如此多的玩家，情愿选择丸喜的虚拟世界结局？思考数日后我只能得出结论，有太多类似丸喜这样的人在现实中受过挫折，终于放弃了抗争选择了向命运妥协，而丸喜的这个世界不仅没有“惩罚”这种妥协，甚至还回报以如梦般的幸福，这种诱惑让人无法拒绝。丸喜的所作所为其实也可以认为是在贯彻属于他自己的正义，他或许某种程度上也在用类似怪盗团的方式去影响更多民众的心灵，帮助民众“战胜”命运的不公。只可惜，任何强加于人的正义一定不再是正义了。</p><p>看过了丸喜的人生故事，与其说丸喜“可怜之人必有可恨之处”，倒不如说丸喜一生都在懦弱地逃避，哪怕在最开始得到力量失去恋人之时他也没有魄力再将恋人追回来，而是放任恋人去过新的生活。也许从这一刻起，“假作真时真亦假”已经贯彻在了他的身上，他将虚拟的世界当做了真正幸福的归宿，对现实世界也从此一叶障目，只能看到痛苦。</p></section></section>
<section><h1>“天下第一”？<a href="#天下第一"><span>#</span></a></h1><p>自发售后不管是P5还是P5R，溢美之词均不绝于耳，“天下第一”的名头也喊得十分响亮。不论是发自肺腑还是慕名跟风，能让诸多玩家喊出天下第一并非易事。网络上已经有着诸多评测分析P5系列的优点，本文就不再罗列了。我仅寥寥数语提几条最吸引我游玩两周目的优点：</p><ul>
<li>出色的人物群像塑造，大大提升了主角代入感</li>
<li>令人着迷的背景音乐</li>
<li>丰富的人格面具，不管是全面具100%收藏还是打造出一两只完美的人格面具都充满乐趣</li>
</ul><p>然而，即便有着上述优点我也不认为它能成为“天下第一”。抛开P5R新加入的诸多硬伤的第三学期，单就起家的P5本体而言也不能说是尽善尽美。为了专心营造主题剧情，游戏把支线任务和特色小玩法的优先级排的很低，基本上成为了主线剧情以及COOP关系的附庸设定，演绎也以重复性较高的对白+战斗为主，损失了不少游戏性。此外剧情的节奏推动是有些失衡的，中后期赶工痕迹明显，细节演绎相比前期也有退步。再就是占据玩家大量游玩时间的迷宫解谜部分，比较遗憾的一点在于殿堂迷宫都是线性解谜的，玩家并不能进入迷宫后自由探索、选择解开不同机关的先后顺序，这一点也体现出了制作组在技术力或者开发成本上的局限性。</p><p>如果要提一些总结性评语的话，我愿意给予P5两个最：</p><ul>
<li>P5是我接触过最有思想深度的JRPG，对于怪盗团行为的合法性讨论几乎贯穿了全部章节，制作组并不因为他们是主角就安插主角光环随心所欲，而是自始自终强调这是怪盗团“坚持自己的正义”并基于这种正义去行动，无论是在秘密基地的会议桌上、国安局审讯室里、乃至最后和丸喜决战前的摊牌里。怪盗团确实能问心无愧地拯救了世界，但这样的问心无愧并不代表正义，民众也必然不可能完全认同（按照怪ch投票，会无限趋近于50 - 50的分布）。所以P5R这种既能塑造主角形象，又能保持思想深度讨论主角立场的平衡做的非常棒。</li>
<li>P5R也是我游玩过最有代入感的JRPG。许多人流连于P5的世界里，更多是老夫聊发少年狂，又或者是圆了一个学生时代曾经遥不可及的梦想。我们全身心融入主角团身上度过了别样的高中生活，甚至拯救了世界，某种程度上算不算怪盗团也偷走了我们的心呢？</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2022-04-15-%E6%B5%B7%E7%91%9E%E6%B2%BB%E5%AE%89%E7%96%8F/</id>
      <title type="text">海瑞治安疏</title>
      <published>2022-04-15T00:00:00.000Z</published>
      <updated>2022-04-15T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2022-04-15-%E6%B5%B7%E7%91%9E%E6%B2%BB%E5%AE%89%E7%96%8F/"/>
      <summary type="text">直言天下第一疏</summary>
      <content type="html"><![CDATA[<p>直言天下第一疏</p>

<section><h1>原文<a href="#原文"><span>#</span></a></h1><p>　　《治安疏》，又称《直言天下第一疏》，是海瑞在嘉靖四十四年（公元1565年）十月所创作的一篇奏疏。 这篇奏疏指责朱厚熜迷信道教、妄想长生、错聩误国的过失，指出天下“吏贪将弱”“民不聊生”，都是由于他的“误举”所致。甚至讽刺他的年号“嘉靖”，意味着“家家皆净而无财用”。全文内容如下：</p><p>　　户部云南清吏司主事臣海瑞谨奏；为直言天下第一事，以正君道、明臣职，求万世治安事：</p><p>　　君者，天下臣民万物之主也。惟其为天下臣民万物之主，责任至重。凡民生利病，一有所不宜，将有所不称其任。是故事君之道宜无不备，而以其责寄臣工，使之尽言焉。臣工尽言，而君道斯称矣。昔之务为容悦，阿谀曲从，致使灾祸隔绝、主上不闻者，无足言矣。</p><p>　　过为计者则又曰：“君子危明主，忧治世。”夫世则治矣，以不治忧之；主则明矣，以不明危之：无乃使之反求眩瞀，莫知趋舍矣乎！非通论也。</p><p>　　臣受国厚恩矣，请执有犯无隐之义，美曰美，不一毫虚美；过曰过，不一毫讳过。不为悦谀，不暇过计，谨披沥肝胆为陛下言之。</p><p>　　汉贾谊陈政事于文帝曰：“进言者皆曰：天下已安已治矣，臣独以为未也。曰安且治者，非愚则谀。”夫文帝，汉贤君也，贾谊非苛责备也。文帝性颇仁柔，慈恕恭俭，虽有爱民之美，优游退逊、尚多怠废之政。不究其弊所不免，概以安且治当之，愚也。不究其才所不能，概以政之安且治颂之，谀也。</p><p>　　陛下自视，于汉文帝何如？陛下天资英断，睿识绝人，可为尧、舜，可为禹、汤、文、武，下之如汉宣之厉精，光武之大度，唐太宗之英武无敌，宪宗之志平僭乱，宋仁宗之仁恕，举一节可取者，陛下优为之。即位初年，铲除积弊，焕然与天下更始。举其大概：箴敬一以养心，定冠履以定分，除圣贤土木之象，夺宦官内外之权，元世祖毁不与祀，祀孔子推及所生。天下忻忻，以大有作为仰之。识者谓辅相得人，太平指日可期，非虚语也，高汉文帝远甚。然文帝能充其仁恕之性，节用爱人，吕祖谦称其能尽人之才力，诚是也。一时天下虽未可尽以治安予之，然贯朽粟陈，民物康阜，三代后称贤君焉。</p><p>　　陛下则锐精未久，妄念牵之而去矣。反刚明而错用之，谓长生可得，而一意玄修。富有四海不曰民之脂膏在是也，而侈兴土木。二十余年不视朝，纲纪驰矣。数行推广事例，名爵滥矣。二王不相见，人以为薄于父子。以猜疑诽谤戮辱臣下，人以为薄于君臣。乐西苑而不返宫，人以为薄于夫妇。天下吏贪将弱，民不聊生，水旱靡时，盗贼滋炽。自陛下登极初年亦有这，而未甚也。今赋役增常，万方则效。陛下破产礼佛日甚，室如悬罄，十余年来极矣。天下因即陛下改元之号而臆之曰：“嘉靖者言家家皆净而无财用也。”</p><p>　　迩者，严嵩罢相，世蕃极刑，差快人意一时称清时焉。然严嵩罢相之后，犹之严嵩未相之先而已，非大清明世界也。不及汉文帝远甚。天下之人不直陛下久矣，内外臣工之所知也。知之，不可谓愚。《诗》云：“衮职有阙，惟仲山甫补之。”今日所赖以弼棐匡救，格非而归之正，诸臣责也。夫圣人岂绝无过举哉？古者设官，亮采惠畴足矣，不必责之以谏。保氏掌谏王恶，不必设也。木绳金砺，圣贤不必言之也，乃修斋建醮，相率进香，天桃天药，相率表贺。建兴宫室，工部极力经营；取香觅宝，户部差求四出。陛下误举，诸臣误顺，无一人为陛下正言焉。都俞吁咈之风，陈善闭邪之义，邈无闻矣；谀之甚也。然愧心馁气，退有后言，以从陛下；昧没本心，以歌颂陛下，欺君之罪何如？</p><p>　　夫天下者，陛下之家也，人未有不顾其家者。内外臣工有官守、有言责，皆所以奠陛下之家而磐石之也。一意玄修，是陛下心之惑也。过于苛断，是陛下情之伪也。而谓陛下不顾其家，人情乎？诸臣顾身家以保一官，多以欺败，以赃败，不事事败，有不足以当陛下之心者。其不然者，君心臣心偶不相值也，遂谓陛下为贱薄臣工。诸臣正心之学微，所言或不免己私，或失详审，诚如胡寅扰乱政事之说，有不足以当陛下之心者。其不然者，君意臣意偶不相值也，遂谓陛下为是己拒谏。执陛下一二事不当之形迹，亿陛下千百事之尽然，陷陛下误终不复，诸臣欺君之罪大矣。《记》曰：“上人疑则百姓惑，下难知则君长劳。”今日之谓也。</p><p>　　为身家心与惧心合，臣职不明，臣以一二事形迹既为诸臣解之矣。求长生心与惑心合，有辞于臣，君道不正，臣请再为陛下开之。</p><p>　　陛下之误多矣，大端在修醮。修醮所以求长生也。自古圣贤止说修身立命，止说顺受其正。盖天地赋予于人而为性命者，此尽之矣。尧、舜、禹、汤、文、武之君，圣之盛也，未能久世不终。下之，亦未见方外士自汉、唐、宋存至今日。使陛下得以访其术者陶仲文，陛下以师呼之，仲文则既死矣。仲文尚不能长生，而陛下独何求之？至谓天赐仙桃药丸，怪妄尤甚。伏羲氏王天下，龙马出河，因则其文以画八卦。禹治水时，神龟负文而列其背，因而第之，以成九畴。河图洛书实有此瑞物，以泄万古不传之秘。天不爱道而显之圣人，借圣人以开示天下，犹之日月星辰之布列，而历数成焉，非虚妄也。宋真宗获天书于乾佑山，孙奭谏曰：“天何言哉？岂有书也？”桃必采而后得，药由人工捣以成者也。兹无因而至，桃药是有足而行耶？天赐之者，有手执而付之耶？陛下玄修多年矣，一无所得。至今日，左右奸人逆陛下玄修妄念，区区桃药之长生，理之所无，而玄修之无益可知矣。</p><p>　　陛下又将谓悬刑赏以督率臣下，分理有人，天下无不可治，而玄修无害矣乎？夫人幼而学，既无致君泽民异事之学，壮而行，亦无致君泽民殊用之心。《太甲》曰：“有言逆于汝志，必求诸道，有言逊于汝志，必求诸非道。”言顺者之未必为道也。即近事观：严嵩有一不顺陛下者乎？昔为贪窃，今为逆本。梁材守道守官，陛下以为逆者也，历任有声，官户部者以有守称之。虽近日严嵩抄没、百官有惕心焉，无用于积贿求迁，稍自洗涤。然严嵩罢相之后，犹严嵩未相之前而已。诸臣宁为严嵩之顺，不为梁材之执。今甚者贪求，未甚者挨日。见称于人者，亦廊庙山林交战热中，鹘突依违，苟举故事。洁己格物，任天下重，使社稷灵长终必赖之者，未见其人焉。得非有所牵制其心，未能纯然精白使然乎？陛下欲诸臣惟予行而莫违也，而责之以效忠；付之以翼为明听也，又欲其顺乎玄修土木之娱：是股肱耳目不为腹心卫也，而自为视听持行之用。有臣如仪、衍焉，可以成“得志与民由之”之业，无是理也。</p><p>　　陛下诚知玄修无益，臣之改行，民之效尤，天下之安与不安、治与不治由之，幡然悟悔，日视正朝，与宰辅、九卿、侍从、言官讲求天下利害，洗数十年君道之误，置其身于尧、舜、禹、汤、文、武之上，使其臣亦得洗数十年阿君之耻，置其身于皋陶、伊、傅之列，相为后先，明良喜起，都俞吁咈。内之宦官宫妾，外之光禄寺厨役，锦衣卫恩荫，诸衙门带俸，举凡无事而官者亦多矣。上之内仓内库，下之户、工部，光禄寺诸厂，段绢、粮料、珠定、器用、木材诸物，多而积于无用，用之非所宜用，亦多矣。诸臣必有为陛下言者。诸臣言之，陛下行之，此则在陛下一节省间而已。京师之一金，田野之百金也。一节省而国有余用，民有盖藏，不知其几也。而陛下何不为之？</p><p>　　官有职掌，先年职守之正、职守之全而未行之。今日职守之废、职守之苟且因循，不认真、不尽法而自以为是。敦本行以端士习，止上纳以清仕途，久任吏将以责成功，练选军士以免召募，驱缁黄游食以归四民，责府州县兼举富教使成礼俗，复屯盐本色以裕边储，均田赋丁差以苏困敝，举天下官之侵渔，将之怯懦，吏之为奸，刑之无少姑息焉。必世之仁，博厚高明悠远之业，诸臣必有陛下言者。诸臣言之，陛下行之，此则在陛下一振作间而已。一振作而诸废具举，百弊铲绝，唐、虞三代之治粲然复兴矣，而陛下何不行之？</p><p>　　节省之，振作之，又非有所劳于陛下也。九卿总其纲，百职分其任，抚按科道纠举肃清之于其间，陛下持大纲、稽治要而责成焉。劳于求贤，逸于任用如天运于上，而四时六气各得其序，恭己无为之道也。天地万物为一体，固有之性也。民物熙洽，熏为太和，而陛下性分中自有真乐矣。可以赞天地之化育，则可与天地参。道与天通，命由我立，而陛下性分中自有真寿矣。此理之所有者，可旋至而立有效者也。若夫服食不终之药，遥望轻举，理之所无者也。理之所无，而切切然散爵禄，竦精神，玄修求之，悬思凿想，系风捕影，终其身如斯而已矣，求之其可得乎？</p><p>　　夫君道不正，臣职不明，此天下第一事也。于此不言，更复何言？大臣持禄而外为谀，小臣畏罪而面为顺，陛下有不得知而改之行之者，臣每恨焉。是以昧死竭忠，惓惓为陛下言之。一反情易向之间，而天下之治与不治，民物之安与不安决焉，伏惟陛下留神，宗社幸甚，天下幸甚。臣不胜战栗恐惧之至，为此具本亲赍，谨具奏闻。</p></section>
<section><h1>感想<a href="#感想"><span>#</span></a></h1><p>　　海瑞上疏前据传已经买好了棺材抬至家中，并且遣散了家人童仆，抱定了必死的决心。嘉靖看后自然大怒，立马将海瑞关入监狱，但最终却因为种种原因没有处决海瑞。这里面包括了嘉靖对自己名声的顾虑、对儿子裕王（即后来的隆庆帝）的考虑、徐阶为首的内阁干涉、甚至是嘉靖自己的良心发现等等。本文不具体展开探讨每一条原因，而是更想从海瑞的角度聊一聊海瑞上疏这件事本身的意义。</p><p>　　嘉靖当朝四十余年，这其中大部分时间里朝堂为严党把持，败坏朝纲、祸国殃民。海瑞在地方任职时期就已经看不惯严党对国家的祸害，并与巡视的严党官员鄢懋卿产生了矛盾，还因此吃了弹劾被降调到偏远的兴国县。尽管嘉靖晚年开始打击严党，但却“倒严而不倒严嵩”，令天下人大失所望。更糟的是，百姓的生活并没有随着严党垮台而回归正常，甚至“犹之严嵩未相之先而已”。于是海瑞抓住根本，选择直接向嘉靖帝上疏。海瑞用词诚恳，观点实事求是，他第一次让修道数十年的嘉靖听到了真话；并且海瑞在针砭时弊的同时也提出了一定的建议，实务性强，没有不着边际的废话。此外，海瑞是几乎无党无私的道德标兵，如左传所言“无暇者可以戮人”，嘉靖找不出他上疏的特殊动机，因此只能选择将文章看下去。换作是其他人，嘉靖第一反应可能是此人结党营私、受人指使。</p><p>　　很多人会质疑海瑞这样的上疏并不能改变现实，又或者其实海瑞所作所为与历史上的其他谏臣并无二致。这里仍旧要抛出我们最开始探讨的主题 - 海瑞上疏这件事本身的意义。嘉靖一直信奉“云在青天水在瓶”，他指望着大臣们各司其职、各安其位，自己就能坐享其成专心修道了，而这样的必然后果就是“二十余年不视朝，纲纪驰矣”。其他大臣知其弊却不敢提出，海瑞却做到了，他的《治安疏》就是万马齐喑时捅破天的一道霹雳。同时，海瑞上疏的动力还是基于海瑞本人绝对的“忠” - 忠于君主、忠于国家。海瑞本人无党无私，个人家庭生活几乎可以用“一贫如洗”形容，在此前提下海瑞的人生价值便几乎全部奉献了给了君主与国家。我不确定当年海瑞上疏前经历了怎样的内心波动，但他能做出这样的决定已经让四百多年后的我肃然起敬。每个时代都需要一个海瑞，这样的人或许会因为人至察而无徒，但是他们的勇气和信念一定能成为浊世中的最后一抹光亮，照耀他人前行。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2022-02-27-%E6%97%A5%E8%AF%AD%E5%8F%91%E9%9F%B3/</id>
      <title type="text">日语发音</title>
      <published>2022-02-27T00:00:00.000Z</published>
      <updated>2022-02-27T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2022-02-27-%E6%97%A5%E8%AF%AD%E5%8F%91%E9%9F%B3/"/>
      <summary type="text">参考B站梦子老师教程和B站阿飞老师教程入门学习日语，以下是日语基础发音规则部分的学习记录。</summary>
      <content type="html"><![CDATA[<p>参考<a href="https://www.bilibili.com/video/BV1Yi4y147FG" target="_blank">B站梦子老师教程</a>和<a href="https://www.bilibili.com/video/BV1Bp4y1D747" target="_blank">B站阿飞老师教程</a>入门学习日语，以下是日语基础发音规则部分的学习记录。</p>

<section><h1>简介<a href="#简介"><span>#</span></a></h1><section><h2>日本文字的组成<a href="#日本文字的组成"><span>#</span></a></h2><ol>
<li>
<p>汉字</p>
<ul>
<li>几百年间陆续从中国传入，但部分汉字是日文仿造中文新创造而成的，例如辻(つじ)</li>
<li>无论是字形还是字义，中日汉字经过演化后差异的程度不同，有的依然完全相同，也有的差异很大</li>
<li>发音上，衍生出了音读和训读
<ul>
<li>音读：模仿中国古汉语的发音</li>
<li>训读：日文固有发音，借用中文汉字表意</li>
</ul>
</li>
</ul>
</li>
<li>
<p>假名</p>
<ul>
<li>由平假名和片假名组成；平假名和片假名一一对应，表意相同，但写法不同
<ul>
<li>平假名：把假借而来的汉字平易简化，来自汉字草书，书写柔美圆润</li>
<li>片假名：取假借汉字的一部分，多取自偏旁部首，来自汉字楷书，书写刚劲有力</li>
</ul>
</li>
<li>大多数场合下使用平假名书写文字，但某些特殊场合一般使用片假名（不局限，有时为了凸显强调也可以刻意将平假名写成片假名形式，可类比英语字母中的单词全大写）
<ul>
<li>外来语</li>
<li>拟声拟态词</li>
<li>动植物名称</li>
</ul>
</li>
</ul>
</li>
<li>
<p>罗马字</p>
<ul>
<li>使用拉丁字母表示日语发音，便于和国际化接轨</li>
<li>常见使用范围
<ul>
<li>招牌广告上的字母</li>
<li>输入法录入文字</li>
</ul>
</li>
</ul>
</li>
</ol></section><section><h2>声调<a href="#声调"><span>#</span></a></h2><ul>
<li>
<p>两种基本规则</p>
<ul>
<li>单词第一个音节和第二个音节高低相反</li>
<li>一个单词的声调中，只有0处/1处下降这两种情况</li>
</ul>
</li>
<li>
<p>两种表记方法</p>
<ul>
<li>
<p>数字表记法</p>
<ul>
<li>在单词后添加⓪①②③④⑤这样的数字标记，表示声调核，即最后一个高读音节（②代表第二个假名是高读，此后全部为低。以此类推）</li>
<li>官方词典多采用此法</li>
</ul>
</li>
<li>
<p>横线标记法</p>
<ul>
<li>在假名上标记横线与竖线。横线代表高音，竖线代表下降，竖线之后的音不能高读</li>
</ul>
<p></p><figure><img src="/blog-assets/images/Japanese/line-tone.png" alt="line-tone.png" /><figcaption>line-tone.png</figcaption></figure><p></p>
</li>
</ul>
</li>
<li>
<p>四种类型</p>
<ul>
<li>平板型：一低二高一直高，助词也高。数字表记用⓪表示。</li>
<li>头高型：一高二低一直低，助词也低。数字表记用①表示。</li>
<li>中高型：两头低中间高，助词低。数字表记可能是②、③……</li>
<li>尾高型：一低二高一直高，助词低。数字表记与单词的长度相等（在此之后还有助词，助词不计入单词长度）</li>
</ul>
</li>
</ul></section></section>
<section><h1>五十音<a href="#五十音"><span>#</span></a></h1><section><h2>总览<a href="#总览"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/50.png" alt="50.png" /><figcaption>50.png</figcaption></figure><p></p><ul>
<li>将日语的所有假名以元音、子音为分类依据进行排列</li>
<li>表的横向为“行”，共有10行；纵向为“段”，共有5段</li>
<li>每行每段包含一个平假名、一个片假名、一个罗马音。三者一一对应</li>
<li>第一行あ行为元音行，日语中一共只有这一行的五个元音；其他行中的假名，都是根据这一段的元音，在元音之前搭配一个辅音拼读而成</li>
</ul></section><section><h2>あ行<a href="#あ行"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/a.png" alt="a.png" /><figcaption>a.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/i.png" alt="i.png" /><figcaption>i.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/u.png" alt="u.png" /><figcaption>u.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/e.png" alt="e.png" /><figcaption>e.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/o.png" alt="o.png" /><figcaption>o.png</figcaption></figure><p></p><ul>
<li>
<p>あい(愛)①：爱</p>
</li>
<li>
<p>え(絵)①：画</p>
</li>
<li>
<p>あおい(青い)②：蓝色</p>
</li>
<li>
<p>うお(魚)⓪：鱼</p>
</li>
</ul></section><section><h2>か行<a href="#か行"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/ka.png" alt="ka.png" /><figcaption>ka.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/ki.png" alt="ki.png" /><figcaption>ki.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/ku.png" alt="ku.png" /><figcaption>ku.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/ke.png" alt="ke.png" /><figcaption>ke.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/ko.png" alt="ko.png" /><figcaption>ko.png</figcaption></figure><p></p><ul>
<li>
<p>いか(烏賊)⓪：鱿鱼</p>
</li>
<li>
<p>えき(駅)①：车站</p>
</li>
<li>
<p>いけ(池)②：池塘</p>
</li>
<li>
<p>かく(書く)①：书写</p>
</li>
<li>
<p>かお(顔)⓪：脸</p>
</li>
<li>
<p>あき(秋)①：秋天</p>
</li>
<li>
<p>あかい(赤い)⓪：红色</p>
</li>
<li>
<p>いく(行く)⓪：去</p>
</li>
<li>
<p>かき(柿)⓪：柿子</p>
</li>
<li>
<p>かかく(価格)⓪：价格</p>
</li>
</ul></section><section><h2>さ行<a href="#さ行"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/sa.png" alt="sa.png" /><figcaption>sa.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/shi.png" alt="shi.png" /><figcaption>shi.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/su.png" alt="su.png" /><figcaption>su.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/se.png" alt="se.png" /><figcaption>se.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/so.png" alt="so.png" /><figcaption>so.png</figcaption></figure><p></p><ul>
<li>
<p>すし(寿司)①②：寿司</p>
</li>
<li>
<p>さけ(酒)⓪：酒</p>
</li>
<li>
<p>おかし(お菓子)②：点心</p>
</li>
<li>
<p>せがい(世界)①：世界</p>
</li>
<li>
<p>あさ(朝)①：早上</p>
</li>
<li>
<p>かそく(加速)⓪：加速</p>
</li>
</ul></section><section><h2>た行<a href="#た行"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/ta.png" alt="ta.png" /><figcaption>ta.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/chi.png" alt="chi.png" /><figcaption>chi.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/tsu.png" alt="tsu.png" /><figcaption>tsu.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/te.png" alt="te.png" /><figcaption>te.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/to.png" alt="to.png" /><figcaption>to.png</figcaption></figure><p></p><ul>
<li>
<p>たこ①：章鱼</p>
</li>
<li>
<p>いと(糸)①：线</p>
</li>
<li>
<p>て(手)①：手，手掌</p>
</li>
<li>
<p>とかい(都会)⓪：城市</p>
</li>
<li>
<p>あつい(暑い)②：热</p>
</li>
<li>
<p>たつ(立つ)①：站立</p>
</li>
</ul></section><section><h2>な行<a href="#な行"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/na.png" alt="na.png" /><figcaption>na.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/ni.png" alt="ni.png" /><figcaption>ni.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/nu.png" alt="nu.png" /><figcaption>nu.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/ne.png" alt="ne.png" /><figcaption>ne.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/no.png" alt="no.png" /><figcaption>no.png</figcaption></figure><p></p><ul>
<li>
<p>いぬ(犬)②：狗</p>
</li>
<li>
<p>ねこ(猫)①：猫</p>
</li>
<li>
<p>にく(肉)②：肉</p>
</li>
<li>
<p>のき(軒)⓪：屋檐</p>
</li>
<li>
<p>なつ(夏)②：夏天</p>
</li>
<li>
<p>あに(兄)①：哥哥</p>
</li>
</ul></section><section><h2>は行<a href="#は行"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/ha.png" alt="ha.png" /><figcaption>ha.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/hi.png" alt="hi.png" /><figcaption>hi.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/fu.png" alt="fu.png" /><figcaption>fu.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/he.png" alt="he.png" /><figcaption>he.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/ho.png" alt="ho.png" /><figcaption>ho.png</figcaption></figure><p></p><ul>
<li>
<p>はな(花)②：花</p>
</li>
<li>
<p>はし(橋)②：桥</p>
</li>
<li>
<p>ひたい(額)⓪：额头</p>
</li>
<li>
<p>ほし(星)⓪：星星</p>
</li>
<li>
<p>へた(下手)②：不擅长</p>
</li>
<li>
<p>ふさい(夫妻)①②：夫妻</p>
</li>
</ul></section><section><h2>ま行<a href="#ま行"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/ma.png" alt="ma.png" /><figcaption>ma.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/mi.png" alt="mi.png" /><figcaption>mi.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/mu.png" alt="mu.png" /><figcaption>mu.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/me.png" alt="me.png" /><figcaption>me.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/mo.png" alt="mo.png" /><figcaption>mo.png</figcaption></figure><p></p><ul>
<li>
<p>まち(街)②：街道</p>
</li>
<li>
<p>あめ(雨)①：雨</p>
</li>
<li>
<p>かいもの(買い物)⓪：购物</p>
</li>
<li>
<p>かみ(髪)②：头发</p>
</li>
<li>
<p>むすめ(娘)③：女儿</p>
</li>
<li>
<p>むし(虫)⓪：虫子</p>
</li>
</ul></section><section><h2>や行<a href="#や行"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/ya.png" alt="ya.png" /><figcaption>ya.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/yu.png" alt="yu.png" /><figcaption>yu.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/yo.png" alt="yo.png" /><figcaption>yo.png</figcaption></figure><p></p><ul>
<li>
<p>やおや(八百屋)⓪：果蔬店</p>
</li>
<li>
<p>おかゆ(お粥)⓪：粥</p>
</li>
<li>
<p>よなか(夜中)⓪：半夜</p>
</li>
<li>
<p>やすみ(休み)③：休息</p>
</li>
</ul></section><section><h2>ら行<a href="#ら行"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/ra.png" alt="ra.png" /><figcaption>ra.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/ri.png" alt="ri.png" /><figcaption>ri.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/ru.png" alt="ru.png" /><figcaption>ru.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/re.png" alt="re.png" /><figcaption>re.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/ro.png" alt="ro.png" /><figcaption>ro.png</figcaption></figure><p></p><ul>
<li>
<p>さくら(桜)⓪：樱花</p>
</li>
<li>
<p>くすり(薬)⓪：药</p>
</li>
<li>
<p>かれし(彼氏)①：男朋友</p>
</li>
<li>
<p>はしる(走る)②：奔跑</p>
</li>
<li>
<p>ロシア①：俄罗斯</p>
</li>
</ul></section><section><h2>わ行<a href="#わ行"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/wa.png" alt="wa.png" /><figcaption>wa.png</figcaption></figure><figure><img src="/blog-assets/images/Japanese/wo.png" alt="wo.png" /><figcaption>wo.png</figcaption></figure><p></p><ul>
<li>
<p>にわ(庭)⓪：院子</p>
</li>
<li>
<p>わらう(笑う)⓪：笑</p>
</li>
</ul></section></section>
<section><h1>浊音/半浊音<a href="#浊音半浊音"><span>#</span></a></h1><p>表记方式：浊音在假名上加两点，半浊音在假名上加一个圆圈。</p><section><h2>ka -&gt; ga<a href="#ka---ga"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/kaga.png" alt="kaga.png" /><figcaption>kaga.png</figcaption></figure><p></p><ul>
<li>
<p>かいがい(海外)①：海外</p>
</li>
<li>
<p>およぐ(泳ぐ)②：游泳</p>
</li>
<li>
<p>かげ(影)①：影子</p>
</li>
<li>
<p>いちご(苺)⓪：草莓</p>
</li>
<li>
<p>かいぎ(会議)①③：会议</p>
</li>
<li>
<p>かぐ(家具)⓪：家具</p>
</li>
<li>
<p>かがく(科学)①：科学</p>
</li>
<li>
<p>げか(外科)⓪：外科</p>
</li>
</ul></section><section><h2>sa -&gt; za<a href="#sa---za"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/saza.png" alt="saza.png" /><figcaption>saza.png</figcaption></figure><p></p><p>注意“shi”转化后变成了“ji”</p><ul>
<li>
<p>みずうみ(湖)③：湖</p>
</li>
<li>
<p>ちず(地図)①：地图</p>
</li>
<li>
<p>ふくざつ(複雑)⓪：复杂</p>
</li>
<li>
<p>じこ(事故)①：事故</p>
</li>
<li>
<p>かぜ(風邪)⓪：感冒</p>
</li>
<li>
<p>しじ(指示)①：指示</p>
</li>
</ul></section><section><h2>ta -&gt; da<a href="#ta---da"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/tada.png" alt="tada.png" /><figcaption>tada.png</figcaption></figure><p></p><p>注意“chi”转化后变成了“ji”，“tsu”转化后变成了“zu”</p><ul>
<li>
<p>くだもの(果物)②：水果</p>
</li>
<li>
<p>ちじむ(縮む)⓪：缩小</p>
</li>
<li>
<p>ドア①：门</p>
</li>
<li>
<p>でぐち(出口)①：出口</p>
</li>
<li>
<p>いだい(偉大)⓪：伟大</p>
</li>
</ul><p>寒暄语：</p><ul>
<li>ただいま：我回来了</li>
<li>いただきます：我开动了</li>
</ul></section><section><h2>ha -&gt; ba, ha -&gt; pa<a href="#ha---ba-ha---pa"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Japanese/bahapa.png" alt="bahapa.png" /><figcaption>bahapa.png</figcaption></figure><p></p><ul>
<li>
<p>バイク①：摩托车</p>
</li>
<li>
<p>ながれぼし(流れ星)③：流星</p>
</li>
<li>
<p>ピアス①：耳钉，耳环</p>
</li>
<li>
<p>ピアノ⓪：钢琴</p>
</li>
<li>
<p>パス⓪：pass</p>
</li>
<li>
<p>ぶた(豚)⓪：猪</p>
</li>
</ul></section></section>
<section><h1>拗音/合拗音<a href="#拗音合拗音"><span>#</span></a></h1><section><h2>拗音<a href="#拗音"><span>#</span></a></h2><ul>
<li>
<p>起源：模仿中国古代汉语的发音产生</p>
</li>
<li>
<p>规则：い段假名（除い、ぢ之外）+ 小一号书写的[や ゆ よ]。片假名也符合这一规律</p>
</li>
<li>
<p>发音：两个假名视为整体，拼读成一拍。需要特别注意视为整体后单词中高读的音节位置</p>
</li>
</ul><p></p><figure><img src="/blog-assets/images/Japanese/ao.png" alt="ao.png" /><figcaption>ao.png</figcaption></figure><p></p><p>单词示例：</p><ul>
<li>
<p>おちゃ(お茶)⓪：茶</p>
</li>
<li>
<p>ジャズ①：爵士乐</p>
</li>
<li>
<p>しゅくしゃ(宿舎)②：宿舍</p>
</li>
<li>
<p>しょくぶつ(植物)②：植物</p>
</li>
</ul><p>寒暄语：</p><ul>
<li>おじゃま(邪魔)します：打扰了。通常用于进门，出门可以换成おじゃま(邪魔)しました</li>
</ul></section><section><h2>合拗音<a href="#合拗音"><span>#</span></a></h2><ul>
<li>
<p>起源：明治维新后为了模仿西方外来语的发音而产生。专门用于表记外来语，因此只有片假名无平假名</p>
</li>
<li>
<p>规则：仍然是辅音假名 + 小一号假名（元音或者yu）书写的合读形式，拼接规则更加随意，没有明显的规律</p>
</li>
</ul><p></p><figure><img src="/blog-assets/images/Japanese/ex_ao.png" alt="ex_ao.png" /><figcaption>ex_ao.png</figcaption></figure><p></p><p>单词示例：</p><ul>
<li>
<p>フィルム①：胶卷</p>
</li>
<li>
<p>プロジェクト②③：项目</p>
</li>
<li>
<p>チェス①：国际象棋</p>
</li>
<li>
<p>サファイア②：蓝宝石</p>
</li>
</ul></section></section>
<section><h1>特殊音节<a href="#特殊音节"><span>#</span></a></h1><section><h2>拨音<a href="#拨音"><span>#</span></a></h2><section><h3>写法<a href="#写法"><span>#</span></a></h3><p>ん  ン  Nn / n</p><p></p><figure><img src="/blog-assets/images/Japanese/nn.png" alt="nn.png" /><figcaption>nn.png</figcaption></figure><p></p></section><section><h3>发音<a href="#发音"><span>#</span></a></h3><p>拨音发音往往受之后的音节影响。一般而言有三种情况：</p><ul>
<li>
<p>[ば ぱ ま]行，发音为”m”</p>
<ul>
<li>さんぽ(散歩)</li>
</ul>
</li>
<li>
<p>[た だ ら な]行，发音为”n”</p>
<ul>
<li>ほんらい(本来)</li>
<li>しんねん(新年)</li>
</ul>
</li>
<li>
<p>其他行发音为“ng”</p>
<ul>
<li>へんか(変化)</li>
<li>れんあい(恋愛)</li>
</ul>
</li>
</ul><p>如果类比汉语拼音中的鼻音，可以近似为：</p><ul>
<li>あ段转化为ang</li>
<li>い段转化为in</li>
<li>う段转化为un</li>
<li>え段转化为en</li>
<li>お段转化为ong</li>
</ul></section><section><h3>示例<a href="#示例"><span>#</span></a></h3><p>单词：</p><ul>
<li>
<p>ワイン①：红酒</p>
</li>
<li>
<p>ふじさん(富士山)①：富士山</p>
</li>
<li>
<p>げんき(元気)①：元气，精神</p>
</li>
<li>
<p>プレゼント②：礼物</p>
</li>
<li>
<p>しゅんかん(瞬間)⓪：瞬间</p>
</li>
<li>
<p>チャンス①：机会</p>
</li>
</ul></section></section><section><h2>促音<a href="#促音"><span>#</span></a></h2><section><h3>写法<a href="#写法-1"><span>#</span></a></h3><ul>
<li>
<p>っ/ッ，输入法输入时在前面加”x”</p>
</li>
<li>
<p>罗马字：双写促音后一个假名的第一个辅音字母</p>
<ul>
<li>みっつ(mi ttsu)</li>
<li>ペット(pe tto)</li>
</ul>
</li>
</ul></section><section><h3>发音<a href="#发音-1"><span>#</span></a></h3><p>促音给人以顿促的感觉，需要在原来连续的两个发音之间插入一段间隙。可以分为两种类型：</p><ul>
<li>
<p>[か た ぱ]行之前，称为阻塞促音。过程：憋一口气形成阻塞 -&gt; 做好下一个音的口型准备 -&gt; 放开气流疾冲而出</p>
<ul>
<li>さっき(sa kki)</li>
<li>もっと(mo tto)</li>
<li>いっぱい(i ppai)</li>
</ul>
</li>
<li>
<p>さ行之前，称为摩擦促音。基本不停止发音，而是摩擦发出s的音</p>
<ul>
<li>まっすぐ(ma ssgu)</li>
<li>ざっし(za sshi)</li>
<li>いっさい(i ssai)</li>
</ul>
</li>
</ul></section><section><h3>示例<a href="#示例-1"><span>#</span></a></h3><p>单词：</p><ul>
<li>
<p>きって(切手)⓪：邮票</p>
</li>
<li>
<p>けっこん(結婚)⓪：结婚</p>
</li>
<li>
<p>ペット①：宠物</p>
</li>
<li>
<p>チケット①②：门票</p>
</li>
<li>
<p>こっか(国家)①：国家</p>
</li>
<li>
<p>せっけん(石けん)⓪：肥皂</p>
</li>
</ul><p>寒暄语：</p><ul>
<li>
<p>いらっしゃいませ：欢迎光临</p>
</li>
<li>
<p>行ってきます：我走了</p>
</li>
<li>
<p>行ってらっしゃい：慢走</p>
</li>
</ul></section></section><section><h2>长音<a href="#长音"><span>#</span></a></h2><section><h3>写法<a href="#写法-2"><span>#</span></a></h3><p>平假名和片假名分别有不同的标记方式，其中平假名又根据不同段进行了区分：</p><p>平假名：</p><ul>
<li>
<p>あ段 + あ，例如おかあさん、おばあさん</p>
</li>
<li>
<p>い段 + い，例如おにいさん、いいえ</p>
</li>
<li>
<p>う段 + う，例如つうやく</p>
</li>
<li>
<p>え段 + い（多数情况下），例如せんせい</p>
</li>
<li>
<p>え段 + え（少数情况下），例如おねえさん、ええと</p>
</li>
<li>
<p>お段 + う（多数情况下），例如おとうさん、おとうと</p>
</li>
<li>
<p>お段 + お（少数情况下），例如とおい、おおさか</p>
</li>
<li>
<p>い段 + や + あ，例如じゃあ</p>
</li>
<li>
<p>い段 + ゆ + う，例如りゅうがく</p>
</li>
<li>
<p>い段 + よ + う，例如りょうり</p>
</li>
</ul><p>片假名：</p><p>加一条横线“ー”，例如スーパー、コーヒー、チャーハン、コンピューター</p><p>规律：</p><p>长音符号只有第一行的五个元音假名；但是单词中有元音假名时并不一定意味着有长音。需要特别小心判断这个元音和前一个假名是否符合长音组合规则。</p></section><section><h3>发音<a href="#发音-2"><span>#</span></a></h3><p>延长前一个音节的发音，发满两个音节的长度。注意不再是念这个假名本身的发音。</p></section><section><h3>示例<a href="#示例-2"><span>#</span></a></h3><p>单词：</p><ul>
<li>
<p>おいしい(美味しい)⓪③：好吃</p>
</li>
<li>
<p>はつもおで(初詣)③：初次参拜神社</p>
</li>
<li>
<p>ごうかく(合格)⓪：合格</p>
</li>
<li>
<p>すもう(相撲)⓪：相扑</p>
</li>
<li>
<p>サッカー①：足球</p>
</li>
<li>
<p>テーブル⓪：桌子</p>
</li>
<li>
<p>べんきょう(勉強)⓪：勤奋</p>
</li>
<li>
<p>こきゅう(呼吸)⓪：呼吸</p>
</li>
<li>
<p>きゅうり(胡瓜)①：黄瓜</p>
</li>
<li>
<p>ちゅうい(注意)①：注意</p>
</li>
<li>
<p>ニュース①：新闻</p>
</li>
<li>
<p>ジャーナリスト④：记者</p>
</li>
</ul><p>寒暄语：</p><ul>
<li>
<p>おはようございます：早上好</p>
</li>
<li>
<p>ありがとうございます：谢谢</p>
</li>
<li>
<p>どういたしましで：不，不用谢</p>
</li>
<li>
<p>ご馳走様(ちそうさま)でした：我吃好了</p>
</li>
<li>
<p>さようなら：再见，有永别/分手的意味，或是正式场合的道别</p>
</li>
</ul></section></section></section>
<section><h1>发音特殊规则<a href="#发音特殊规则"><span>#</span></a></h1><section><h2>送气音/非送气音<a href="#送气音非送气音"><span>#</span></a></h2><p>[か た ぱ]这三行的音根据单词中所处位置的不同，发音有两种</p><ul>
<li>
<p>位于词头，送气音</p>
<ul>
<li>かお(顔)⓪：脸</li>
<li>たこ①：章鱼</li>
</ul>
</li>
<li>
<p>位于词中或词尾，不送气音</p>
<ul>
<li>つくえ(机)⓪：桌子</li>
<li>たつ(立つ)①：站立</li>
</ul>
</li>
</ul><p>注意非送气音只是适度削弱读音气流的强度，但不能完全发成浊音，写法上更不能与浊音假名混淆。依然推荐写什么假名就读对应发音，这样一定不会出错。</p></section><section><h2>浊音/鼻浊音<a href="#浊音鼻浊音"><span>#</span></a></h2><p>が行根据位置不同发音有两种：</p><ul>
<li>
<p>位于词头，浊音，发“ga”</p>
<ul>
<li>ぐあい(具合)⓪：情形</li>
<li>ごい(語彙)①：词汇</li>
</ul>
</li>
<li>
<p>位于词中或词尾，发浊音或者鼻浊音均可。鼻浊音可以近似理解为”n + ga”的组合，快速连读为nga, ngi等等</p>
<ul>
<li>かがく(科学)①：科学</li>
<li>かげ(影)①：影子</li>
</ul>
</li>
</ul><p>目前鼻浊音主要由日本的播音员、老年人、女性使用，但也有很多年轻人更习惯使用正常的浊音。</p></section><section><h2>发音相同的两组浊音<a href="#发音相同的两组浊音"><span>#</span></a></h2><ul>
<li>[じ ぢ]分别对应了ji，而[ず づ]分别对应了zu。一般而言使用ji默认代表じ，而使用zu默认代表ず。但也有少数特例，例如つづく(未完待续)</li>
<li>文字录入时，ぢ要打成di，づ要打成du（相当于回归原先的ta -&gt; da转化方式）</li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2022-02-27-%E6%97%A5%E8%AF%AD%E8%AF%BE%E6%96%87/</id>
      <title type="text">日语课文</title>
      <published>2022-02-27T00:00:00.000Z</published>
      <updated>2022-02-27T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2022-02-27-%E6%97%A5%E8%AF%AD%E8%AF%BE%E6%96%87/"/>
      <summary type="text">参考B站梦子老师教程和B站阿飞老师教程入门学习日语，以下是《新版标准日本语》课文的学习记录。</summary>
      <content type="html"><![CDATA[<p>参考<a href="https://www.bilibili.com/video/BV1Yi4y147FG" target="_blank">B站梦子老师教程</a>和<a href="https://www.bilibili.com/video/BV1Bp4y1D747" target="_blank">B站阿飞老师教程</a>入门学习日语，以下是《新版标准日本语》课文的学习记录。</p>

<section><h1>1 小李是中国人<a href="#1-小李是中国人"><span>#</span></a></h1><section><h2>单词<a href="#单词"><span>#</span></a></h2><p>国家：</p><ul>
<li>
<p>ちゅうごくじん(中国人)④：中国人</p>
</li>
<li>
<p>にほんじん(日本人)④：日本人</p>
</li>
<li>
<p>かんこくじん(韓国人)④：韩国人</p>
</li>
<li>
<p>アメリカ人④：美国人</p>
</li>
<li>
<p>フランス人④：法国人</p>
</li>
</ul><p>城市：</p><ul>
<li>
<p>とうきょう(東京)⓪：东京</p>
</li>
<li>
<p>ペキン(北京)①：北京</p>
</li>
<li>
<p>しゃんはい(上海)①：上海</p>
</li>
</ul><p>学校：</p><ul>
<li>
<p>がくせい(学生)⓪：学生</p>
</li>
<li>
<p>せいと(生徒)①：学生</p>
</li>
<li>
<p>りゅうがくせい(留学生)③：留学生</p>
</li>
<li>
<p>けんしゅうせい(研修生)③：进修生</p>
</li>
<li>
<p>きょうじゅ(教授)⓪：教授</p>
</li>
<li>
<p>だいがく(大学)⓪：大学</p>
</li>
</ul><p>企业：</p><ul>
<li>
<p>しゃいん(社員)①：职员</p>
</li>
<li>
<p>かいしゃいん(会社員)③：公司职员</p>
</li>
<li>
<p>かちょう(課長)⓪：科长</p>
</li>
<li>
<p>しゃちょう(社長)⓪：总经理</p>
</li>
<li>
<p>てんいん(店員)①：店员</p>
</li>
<li>
<p>きぎょう(企業)①：企业</p>
</li>
<li>
<p>きかく(企画)①：策划公司</p>
</li>
<li>
<p>りょこうしゃ(旅行者)②：旅行社</p>
</li>
</ul><p>动词：</p><ul>
<li>でむかえ(出迎え)⓪：迎接</li>
</ul><p>人称：</p><ul>
<li>
<p>わたし(私)⓪：我</p>
</li>
<li>
<p>ちち(父)①②：父亲</p>
</li>
<li>
<p>ひと(人)⓪：人</p>
</li>
<li>
<p>あのひと(あの人)②：那个人</p>
</li>
<li>
<p>あなた②：你</p>
</li>
<li>
<p>くん(君)：称呼年纪相仿，或者年纪比自己小的男性</p>
</li>
<li>
<p>さん：基本男女都可以使用，但只用于他人的姓名后，不用于自己的姓名后</p>
</li>
</ul><p>助词、副词：</p><ul>
<li>
<p>どうも①：非常，很</p>
</li>
<li>
<p>はい①：是，是的</p>
</li>
<li>
<p>いいえ③：不，不是</p>
</li>
<li>
<p>ちがいます④：不是，可与“いいえ”连用</p>
</li>
<li>
<p>あっ：哎，哎呀。一般是吃惊或者有所感触时发出的声音，例如“あっ、すみません”</p>
</li>
<li>
<p>そうです①：是这样</p>
</li>
</ul><p>寒暄语：</p><ul>
<li>
<p>こんにちは⑤：你好</p>
</li>
<li>
<p>こんばんは⑤：晚上好</p>
</li>
<li>
<p>すみません④：对不起，打扰了（更正式一些的道歉）</p>
</li>
<li>
<p>ごめんなさい：对不起</p>
</li>
<li>
<p>初めまして④：初次见面</p>
</li>
<li>
<p>わかりません⑤：我不知道</p>
</li>
</ul><p>人名：</p><p>注意大部分日文名声调都是⓪型，当不确定名字发音时首选用这个发音去读；其次是①型</p><ul>
<li>
<p>もり(森)⓪：森</p>
</li>
<li>
<p>はやし(林)⓪：林</p>
</li>
<li>
<p>おの(小野)⓪：小野</p>
</li>
<li>
<p>よしだ(吉田)⓪：吉田</p>
</li>
<li>
<p>たなか(田中)⓪：田中</p>
</li>
<li>
<p>なかむら(中村)⓪：中村</p>
</li>
<li>
<p>たろう(太郎)①：太郎</p>
</li>
<li>
<p>さとう(佐藤)①：佐藤</p>
</li>
<li>
<p>たかはし(高橋)②：高桥</p>
</li>
</ul></section><section><h2>语法<a href="#语法"><span>#</span></a></h2><ol>
<li>
<p>(名)は (名)です</p>
<p>可理解为汉语中的“A者，B也”，或者“A是B”。前面的“Aは”是主语部分，注意助词“は”用于提示主题（A是这句的主题），因此要发“わ”的音；后面的“Bです”是谓语，“です”可以当成“是”来理解。</p>
<ul>
<li>
<p>私 は 中国人です</p>
</li>
<li>
<p>李さん は 日本人です</p>
</li>
<li>
<p>私 は 学生です</p>
</li>
</ul>
</li>
<li>
<p>(名)は (名)ではありません</p>
<p>可理解为汉语中的“A不是B”。“では”在口语中也可以用“じゃ”代替，但书面语等正式场合不能使用</p>
<ul>
<li>
<p>私 は 日本人ではありません</p>
</li>
<li>
<p>私 は 田中ではありません</p>
</li>
</ul>
</li>
<li>
<p>(名)は (名)ですか</p>
<p>可理解为汉语中的“A是B吗”。助词“か”放在句尾表示疑问，但注意日语的问句在句尾不使用问号，并且回答时一般只有“はい”和“いいえ”两种回答。</p>
<ul>
<li>
<p>あなた は 佐藤さんですか。はい、佐藤です（如果懒得重复一遍，也可以直接はい、そうです）</p>
</li>
<li>
<p>キムさん は 中国人ですか。いいえ、中国人ではありません。韓国人です（如果懒得重复一遍，也可以直接いいえ、ちがいます）</p>
</li>
<li>
<p>吉田さん ですか。いいえ、ちがいます。小野です。</p>
</li>
</ul>
</li>
<li>
<p>(名)の(名)</p>
<p>一般情况下“の”相当于汉语“的”的意思。助词“の”连接两个名词，表示前面的名词是后面名词从属的机构、国家和属性。</p>
<ul>
<li>
<p>李さん は JC企画の社員です</p>
</li>
<li>
<p>北京旅行者 は 中国の企業です</p>
</li>
<li>
<p>私 は 北京大学の学生です</p>
</li>
</ul>
</li>
</ol><p>其他：</p><ol>
<li>
<p>第二人称的使用</p>
<p>在不知道对方姓名而又必须招呼的时候，才会使用第二人称“あなた”，否则用多了会显得很不礼貌。“君”同理。</p>
</li>
<li>
<p>省略</p>
<p>あなたは佐藤さんですか。はい、（私は）佐藤です。这边的“私は”就是被省略的部分，因为总是被重复很啰嗦。否定句中同样可以这样省略。</p>
</li>
<li>
<p>初次见面请多关照的用法</p>
<p>完整向人打招呼以及回复流程：</p>
<ul>
<li>
<p>初めましで、李です。どうぞ よろしく お願いします。“どうぞ” 一般指代“请”做什么事</p>
</li>
<li>
<p>こちらこそ、(どうぞ よろしく お願いします)</p>
</li>
</ul>
<p>注意回复时一般不需要重复一遍，只要讲到“こちらこそ”即可，后面往往被省略。</p>
</li>
</ol></section></section>
<section><h1>2 这是书<a href="#2-这是书"><span>#</span></a></h1><section><h2>单词<a href="#单词-1"><span>#</span></a></h2><p>地名：</p><ul>
<li>
<p>ながしま(長島)⓪：长岛</p>
</li>
<li>
<p>スワトウ(汕頭)②：汕头</p>
</li>
<li>
<p>ロンドン①：伦敦</p>
</li>
</ul><p>办公用具：</p><ul>
<li>
<p>ほん(本)①：书</p>
</li>
<li>
<p>かばん(かばん)⓪：公文包</p>
</li>
<li>
<p>ノート⓪：笔记本</p>
</li>
<li>
<p>えんぴつ(鉛筆)⓪：铅笔</p>
</li>
<li>
<p>てちょ(手帳)⓪：记事本</p>
</li>
</ul><p>生活用品：</p><ul>
<li>
<p>かさ(傘)①：伞</p>
</li>
<li>
<p>くつ(靴)②：鞋子</p>
</li>
<li>
<p>おみやげ(お土産)⓪：礼物</p>
</li>
<li>
<p>めいさんひん(名産品)⓪：特产</p>
</li>
<li>
<p>シルク①：丝绸</p>
</li>
<li>
<p>ハンカチ⓪：手绢</p>
</li>
<li>
<p>しんぶん(新聞)⓪：报纸</p>
</li>
<li>
<p>ざっし(雑誌)⓪：杂志</p>
</li>
<li>
<p>じしょ(辞書)①：词典</p>
</li>
<li>
<p>しゃしん(写真)⓪：照片</p>
</li>
</ul><p>电器：</p><ul>
<li>
<p>カメラ①：照相机</p>
</li>
<li>
<p>デジカメ⓪：数码照相机</p>
</li>
<li>
<p>テレビ①：电视</p>
</li>
<li>
<p>パソコン⓪：个人电脑（注意这个单词来自于personal 和 computer两个单词片假名的前缀合并）</p>
</li>
<li>
<p>ラジオ①：收音机</p>
</li>
<li>
<p>でんわ(電話)⓪：电话</p>
</li>
</ul><p>家具：</p><ul>
<li>
<p>つくえ(机)⓪：桌子</p>
</li>
<li>
<p>いす(椅子)⓪：椅子</p>
</li>
<li>
<p>かぎ(鍵)②：钥匙</p>
</li>
<li>
<p>とけい(時計)⓪：时钟</p>
</li>
</ul><p>交通工具：</p><ul>
<li>
<p>くるま(車)⓪：车</p>
</li>
<li>
<p>じてんしゃ(自転車)⓪：自行车</p>
</li>
</ul><p>人称：</p><ul>
<li>
<p>かた(方)②：（敬称）位、人</p>
</li>
<li>
<p>かぞく(家族)⓪：家人、家属</p>
</li>
<li>
<p>はは(母)①：（我）母亲</p>
</li>
<li>
<p>おかあさん(お母さん)①：母亲</p>
</li>
</ul><p>指示代词：</p><ul>
<li>
<p>これ⓪：这，这个</p>
</li>
<li>
<p>この⓪：这，这个（连体，后面接名词）</p>
</li>
<li>
<p>それ⓪：那，那个</p>
</li>
<li>
<p>その⓪：那，那个（连体，后接名词）</p>
</li>
<li>
<p>あれ⓪：那，那个（指代的事物在距离上往往会比それ更远一些）</p>
</li>
<li>
<p>あの⓪：那，那个（连体，后接名词）</p>
</li>
<li>
<p>どれ①：哪，哪个</p>
</li>
<li>
<p>どなた①：哪，哪个（比起どれ更适合面对年龄大、地位高的对象使用）</p>
</li>
<li>
<p>どの①：哪，哪个（连体，后接名词）</p>
</li>
<li>
<p>なん(何)①：什么</p>
</li>
<li>
<p>だれ(誰)①：谁</p>
</li>
</ul></section><section><h2>语法<a href="#语法-1"><span>#</span></a></h2><ol>
<li>
<p>これ/それ/あれ は (名)です</p>
<p>说话人和听话人相隔一段距离面对面时：</p>
<ul>
<li>これ指代离说话人较近的事物</li>
<li>それ指代离听话人较近的事物</li>
<li>あれ指代离双方都有些距离的事物</li>
</ul>
<p>说话人和听话人处于同一位置，并且面向同一方向时：</p>
<ul>
<li>これ指代的物体距离最近</li>
<li>それ指代的物体距离较远</li>
<li>あれ指代的物体距离更远</li>
<li>どれ指代的物体距离不明，用于疑问</li>
</ul>
<p>例句：</p>
<ul>
<li>
<p>これ は 本 です</p>
</li>
<li>
<p>それ は かばん です</p>
</li>
<li>
<p>あれ は テレビ です</p>
</li>
</ul>
</li>
<li>
<p>誰ですか / 何ですか</p>
<p>“誰”用于不知道是什么人，而“何”用于不知道是什么事物</p>
<ul>
<li>
<p>それは 何ですか</p>
</li>
<li>
<p>あの人は 誰ですか</p>
</li>
</ul>
<p>注意”誰”通常用于对方与自己地位相当，或者比自己地位低。如果是尊长或者地位更高的人，要用“どたな”，例如：どなたさんですか</p>
</li>
<li>
<p>この/その/あの (名)は (名)のです</p>
<p>修饰名词，表示的位置关系和これ/それ/あれ对应相同</p>
<ul>
<li>
<p>この カメラは スミスのです</p>
</li>
<li>
<p>その 自転車は 森さんのです</p>
</li>
<li>
<p>あの ノートは 誰のですか</p>
</li>
</ul>
<p>注意，第二个(名)の后面相当于省略了第一个(名)，避免重复一遍</p>
</li>
<li>
<p>どれ/どの (名) ですか</p>
<p>どれ/どの是在无法用これ/それ/あれ确定事物时，所用的疑问句式。</p>
<ul>
<li>
<p>森さんの かばんは どれ ですか</p>
</li>
<li>
<p>長島さんの 傘は どれ ですか</p>
</li>
<li>
<p>小野さんの 机は どの机 ですか</p>
</li>
</ul>
<p>注意，这里的どの后面的名词不可以省略</p>
</li>
</ol><p>其他：</p><ol>
<li>
<p>“方”的使用</p>
<p>一般是一个人的尊称，例如“この方”、“その方”等等，尊称这位、那位，适合指代长辈。</p>
</li>
<li>
<p>问年龄</p>
<p>最直接的问法就是“何歳”或者“幾つ”(いくつ)，但不适用于直接向年长的人发问。如果要稍微礼貌一些，可以各自加一些修饰语，例如“何歳ですか”或者“お幾つ”</p>
</li>
<li>
<p>“はい”和“ええ”的区别</p>
<p>二者大部分时候可以互相替代使用，不过“はい”稍微礼貌一些。另外当别人叫到自己名字时，必须用“はい”应答</p>
</li>
</ol></section></section>
<section><h1>3 这里是商场<a href="#3-这里是商场"><span>#</span></a></h1><section><h2>单词<a href="#单词-2"><span>#</span></a></h2><p>地点：</p><ul>
<li>
<p>ばしょ(場所)①：场所</p>
</li>
<li>
<p>デパート②：百货商店</p>
</li>
<li>
<p>しょくどう(食堂)⓪：食堂</p>
</li>
<li>
<p>ゆうびんきょく(郵便局)③：邮局</p>
</li>
<li>
<p>ぎんこう(銀行)⓪：银行</p>
</li>
<li>
<p>としょかん(図書館)②：图书馆</p>
</li>
<li>
<p>マンション①：豪华公寓</p>
</li>
<li>
<p>ホテル①：宾馆</p>
</li>
<li>
<p>コンビニ⓪：便利店</p>
</li>
<li>
<p>きっさてん(喫茶店)⓪：咖啡店</p>
</li>
<li>
<p>びょういん(病院)⓪：医院</p>
</li>
<li>
<p>ほんや(本屋)①：书店</p>
</li>
<li>
<p>レストラン①：餐厅</p>
</li>
<li>
<p>ビル②：大楼、大厦</p>
</li>
<li>
<p>たてもの(建物)②：大楼，建筑物</p>
</li>
<li>
<p>トイレ①：厕所</p>
</li>
<li>
<p>おてあらい(お手洗い)②：洗手间</p>
</li>
<li>
<p>じむしょ(事務所)②：事务所</p>
</li>
<li>
<p>うりば(売り場)⓪：柜台、出售处</p>
</li>
<li>
<p>いりぐち(入口)⓪：入口</p>
</li>
<li>
<p>うけつけ(受付)⓪：接待处</p>
</li>
<li>
<p>bargain かいじょう(バーゲン会場)⑤：降价大卖场</p>
</li>
<li>
<p>エスカレーター④：自动扶梯</p>
</li>
</ul><p>服饰：</p><ul>
<li>
<p>ふく(服)②：衣服</p>
</li>
<li>
<p>コート①：风衣、大衣</p>
</li>
<li>
<p>セーター①：毛衣</p>
</li>
</ul><p>地理：</p><ul>
<li>
<p>くに(国)⓪：国家</p>
</li>
<li>
<p>ちず(地図)①：地图</p>
</li>
</ul><p>方位：</p><ul>
<li>
<p>となり(隣)⓪：旁边</p>
</li>
<li>
<p>しゅうへん(周辺)⓪：附近，周边</p>
</li>
<li>
<p>ここ⓪：这里</p>
</li>
<li>
<p>そこ⓪：那里</p>
</li>
<li>
<p>あそこ⓪：那里，距离比そこ更远</p>
</li>
<li>
<p>こちら⓪：这边</p>
</li>
<li>
<p>そちら⓪：那边</p>
</li>
<li>
<p>あちら⓪：那边，距离比そちら更远</p>
</li>
<li>
<p>どこ⓪：哪里</p>
</li>
<li>
<p>どちら⓪：哪边</p>
</li>
</ul><p>日期：</p><ul>
<li>
<p>きのう(昨日)①：昨天</p>
</li>
<li>
<p>きょう(今日)①：今天</p>
</li>
<li>
<p>あした(明日)②：明天</p>
</li>
<li>
<p>げつようび(月曜日)③：星期一</p>
</li>
<li>
<p>かようび(火曜日)②：星期二</p>
</li>
<li>
<p>すいようび(水曜日)③：星期三</p>
</li>
<li>
<p>もくようび(木曜日)③：星期四</p>
</li>
<li>
<p>きんようび(金曜日)③：星期五</p>
</li>
<li>
<p>どようび(土曜日)②：星期六</p>
</li>
<li>
<p>にちようび(日曜日)③：星期日</p>
</li>
</ul></section><section><h2>语法<a href="#语法-2"><span>#</span></a></h2><ol>
<li>
<p>ここ/そこ/あそこ は (名)です</p>
<p>指示场所时，用ここ/そこ/あそこ，表示的位置关系和これ/それ/あれ相同</p>
<p>例句：</p>
<ul>
<li>ここ は デパート です</li>
<li>そこ は 図書館 です</li>
<li>あそこ は 入り口 です</li>
</ul>
</li>
<li>
<p>(名) は (场所名)です</p>
<p>表示前一个名字“存在于”某一个场所之中，常用来指示方位</p>
<ul>
<li>
<p>食堂 は デパート 7階 です</p>
</li>
<li>
<p>トイレ は ここ です</p>
</li>
<li>
<p>小野さん は 事務所 です</p>
</li>
</ul>
<p>注意例句第三句中不能和之前学的“AはBです”混淆，即不能翻译成“小野是事务所”，因为这里前为人后为场所不能匹配，所以应当理解为小野在事务所内。日语有多种表示存在的语法，此处是其中一种可能出现的形式。</p>
</li>
<li>
<p>(名) は どこですか</p>
<p>修饰名词，表示的位置关系和これ/それ/あれ对应相同</p>
<ul>
<li>
<p>トイレ は どこですか。あちらです</p>
</li>
<li>
<p>あなたの かばんは どこですか。私の かばんは ここです</p>
</li>
</ul>
</li>
<li>
<p>(名)も (名)です</p>
<p>助词“も”相当于汉语的“也”，注意“も”出现时不会再有“は”</p>
<ul>
<li>
<p>あなたも 中国人ですか。</p>
</li>
<li>
<p>ここは JC企画の ビルです。あそこも JC企画の ビルです</p>
</li>
</ul>
</li>
<li>
<p>(名)は (名)ですか、(名)ですか、…</p>
<p>答案有多种可能时，而询问其中一种时，可以重复地使用谓语“ですか”</p>
<ul>
<li>
<p>かばん売り場は 一階ですか、二階ですか。 　</p>
</li>
<li>
<p>今日は 水曜日ですか、木曜日ですか。</p>
</li>
</ul>
</li>
<li>
<p>(名)は いくらですか</p>
<p>询问某物的价格。</p>
<ul>
<li>
<p>これは いくらですか。</p>
</li>
<li>
<p>この服は いくらですか。</p>
</li>
</ul>
</li>
</ol><p>其他：</p><ol>
<li>
<p>省略已知部分</p>
<p>例如连续询问多个物品的价格，第一个已经用“これは いくらですか。”开头问过，之后的就可以直接“それは”、“られは”。</p>
</li>
<li>
<p>礼貌用语</p>
<p>“あちら”相比起“あそこ”会更加礼貌一些。同理“こちら”也比“ここ”更礼貌。另外，“こちら”和“あちら”也可以用来礼貌地指代“这个人/那个人”，“这位/那位”。</p>
<p>同理，疑问句也有这样的用法。例如询问对方来自哪个国家，用“どちら”就比”どこ”礼貌：</p>
<ul>
<li>お国は どちらですか</li>
</ul>
</li>
<li>
<p>对话的开端</p>
<p>想要和人讲话不一定非要用“すみません”开始，也可以用更口语化的“あのう“</p>
</li>
<li>
<p>句尾的语气词</p>
<p>如果省略已知部分，以“は”结尾问问题，“は”的声调要适当上提，表示疑问。</p>
<p>类似的还有“ですか”，如果“か”声调上提就表示疑问，如果是下降调就表示附和或者这样啊的意思，例如”そうですか“</p>
</li>
</ol></section></section>
<section><h1>4 房间里有桌椅<a href="#4-房间里有桌椅"><span>#</span></a></h1><section><h2>单词<a href="#单词-3"><span>#</span></a></h2><p>房子：</p><ul>
<li>
<p>いま(居間)②：起居室</p>
</li>
<li>
<p>へや(部屋)②：房间、屋子</p>
</li>
<li>
<p>にわ(庭)⓪：院子</p>
</li>
<li>
<p>いえ(家)②：家</p>
</li>
<li>
<p>かべ(壁)⓪：墙壁</p>
</li>
</ul><p>家具：</p><ul>
<li>
<p>ほんだな(本棚)①：书架</p>
</li>
<li>
<p>ベッド①：床</p>
</li>
<li>
<p>れいぞうこ(冷蔵庫)③：冰箱</p>
</li>
<li>
<p>スイッチ②：开关</p>
</li>
<li>
<p>はこ(箱)⓪：盒子、箱子</p>
</li>
</ul><p>球类：</p><ul>
<li>
<p>サッカーボール⑤：足球</p>
</li>
<li>
<p>バスケットボール⑥：篮球</p>
</li>
<li>
<p>バレーボール④：排球</p>
</li>
</ul><p>个人用品：</p><ul>
<li>めがね(眼鏡)①：眼镜</li>
</ul><p>人物：</p><ul>
<li>
<p>こども(子供)⓪：孩子</p>
</li>
<li>
<p>おとな(大人)⓪：大人、成年人</p>
</li>
<li>
<p>きょうだい(兄弟)①：兄弟姐妹</p>
</li>
<li>
<p>りょうしん(両親)①：父母、双亲</p>
</li>
<li>
<p>いもうと(妹)④：妹妹</p>
</li>
<li>
<p>おとこ(男)③：男性</p>
</li>
<li>
<p>おんな(女)③：女性</p>
</li>
</ul><p>方位词：</p><ul>
<li>
<p>うえ(上)⓪：（绝对平面的）上面</p>
</li>
<li>
<p>そと(外)①：外面</p>
</li>
<li>
<p>なか(中)①：里面、中间</p>
</li>
<li>
<p>した(下)⓪：（绝对平面的）下面</p>
</li>
<li>
<p>まえ(前)①：前面</p>
</li>
<li>
<p>うしろ(後ろ)⓪：后面</p>
</li>
<li>
<p>ちかく(近く)①：附近</p>
</li>
<li>
<p>となり(隣)⓪：邻近、附近</p>
</li>
</ul><p>地点：</p><ul>
<li>
<p>きょうしつ(教室)⓪：教室</p>
</li>
<li>
<p>かいぎしつ(会議室)③：会议室</p>
</li>
<li>
<p>としょしつ(図書室)②：图书室</p>
</li>
<li>
<p>こうえん(公園)⓪：公园</p>
</li>
<li>
<p>はなや(花屋)②：花店</p>
</li>
<li>
<p>ばいてん(売店)⓪：小卖部</p>
</li>
<li>
<p>ちかてつ(地下鉄)⓪：地铁</p>
</li>
</ul><p>生活：</p><ul>
<li>ひとりぐらし(一人暮らし)④：一个人住</li>
</ul><p>地名：</p><ul>
<li>
<p>よこはま(横浜)⓪：横滨</p>
</li>
<li>
<p>なごや(名古屋)①：名古屋</p>
</li>
<li>
<p>おおさか(大阪)⓪：大阪</p>
</li>
</ul></section><section><h2>语法<a href="#语法-3"><span>#</span></a></h2><ol>
<li>
<p>あります</p>
<p>あります用于花、草、桌子这种不具有意志的事物，表示这些事物“有”，“存在”。</p>
<ul>
<li>
<p>某地有某物：</p>
<p>(场所名)に (物名)が あります</p>
<p>(场所名)に 何が ありますか</p>
<ul>
<li>部屋に 机が あります</li>
<li>ここに 本が あります</li>
<li>庭に 何が ありますが</li>
</ul>
</li>
<li>
<p>某物在某地：</p>
<p>(物名)は (场所名)に あります</p>
<p>(物名)は どこに ありますか</p>
<ul>
<li>椅子は 部屋に あります</li>
<li>本は ここに あります</li>
<li>図書館は どこに ありますが</li>
</ul>
</li>
</ul>
<p>注意在实际生活中，疑问句也可以用どこですか替代，因为无论主语是否有意志都能适用。</p>
</li>
<li>
<p>います</p>
<p>います用于人、动物这种具有意志的事物，表示这些事物“有”，“存在”。</p>
<ul>
<li>
<p>某地有某物：</p>
<p>(场所名)に (动物名)が います</p>
<p>(场所名)に 誰が いますか</p>
<ul>
<li>部屋に 猫が います</li>
<li>公園に 子供が います</li>
<li>あそこに 誰が いますが</li>
</ul>
</li>
<li>
<p>某物在某地：</p>
<p>(动物名)は (场所名)に います</p>
<p>(动物名)は どこに いますか</p>
<ul>
<li>吉田さんは 庭に います</li>
<li>子供は 公園に います</li>
<li>犬は どこに いますが</li>
</ul>
</li>
</ul>
<p>注意在实际生活中，疑问句也可以用どこですか替代，因为无论主语是否有意志都能适用。</p>
</li>
<li>
<p>(名)と(名)</p>
<p>助词と加在两个名词之间表示并列，相当于汉语的“和”</p>
<ul>
<li>時計 と 眼鏡</li>
<li>ビール と ウィスキー</li>
</ul>
<p>结合上面学的存在句式：</p>
<ul>
<li>居間に テレビ と ビデオが あります</li>
<li>コーラー と ケーキは 冷蔵庫に あります</li>
</ul>
</li>
<li>
<p>方位形容</p>
<p>(名)の(方位)</p>
<ul>
<li>机の上に 猫が います</li>
<li>会社の隣に 花屋 あります</li>
<li>猫は 箱の中に います</li>
<li>売店は 駅の外に あります</li>
</ul>
</li>
<li>
<p>ね</p>
<p>当说话人就某事征求听话人的意见时，句尾用“ね”读声调。（听起来会有一些娘，多用于女性）</p>
<ul>
<li>この新聞は 林さんのですね</li>
<li>駅の前に 銀行が ありますね</li>
</ul>
</li>
<li>
<p>疑问句 + も + 否定动词</p>
<p>强调“完全没有“，”什么也没有“</p>
<ul>
<li>教室に 誰も いません</li>
<li>冷蔵庫に 何も ありません</li>
<li>部屋に 誰も いません</li>
</ul>
</li>
</ol></section></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2022-02-06-java%E5%BA%95%E5%B1%82/</id>
      <title type="text">Java底层</title>
      <published>2022-02-06T00:00:00.000Z</published>
      <updated>2022-02-06T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2022-02-06-java%E5%BA%95%E5%B1%82/"/>
      <summary type="text">从更底层的角度了解Java。</summary>
      <content type="html"><![CDATA[<p>从更底层的角度了解Java。</p>

<section><h1>集合(Collections)<a href="#集合collections"><span>#</span></a></h1><section><h2>Java数组<a href="#java数组"><span>#</span></a></h2><p>所谓数组，是相同数据类型的元素按一定顺序排列的集合。Java中一般来说有三种声明数组的方式：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// method1</span></div></div><div><div><div>2</div></div><div><span>char</span><span>[] array1 </span><span><span>=</span><span> {</span></span><span>'a'</span><span><span>,</span><span> </span></span><span>'b'</span><span><span>,</span><span> </span></span><span>'c'</span><span><span>}</span><span>;</span></span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>// method2</span></div></div><div><div><div>5</div></div><div><span>char</span><span>[] array2 </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[]{</span><span>'a'</span><span><span>,</span><span> </span></span><span>'b'</span><span><span>,</span><span> </span></span><span>'c'</span><span><span>}</span><span>;</span></span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>// method3</span></div></div><div><div><div>8</div></div><div><span>char</span><span>[] array3 </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[</span><span>3</span><span><span>]</span><span>;</span></span></div></div><div><div><div>9</div></div><div><span>array[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>'a'</span><span>;</span></div></div><div><div><div>10</div></div><div><span>array[</span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>'b'</span><span>;</span></div></div><div><div><div>11</div></div><div><span>array[</span><span>2</span><span><span>] </span><span>=</span><span> </span></span><span>'c'</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这三种写法看似有明显的区别，然而经过反编译之后会发现，它们都被转化成了同一种写法。也就是说，这三种写法的实质操作是一样的，并且每一个数组都是按顺序排列在堆内存中，这使得我们可以通过下标的方式来直接访问数组里的元素。</p><hr /><p>看完一维数组，二维数组基本也弄懂了。在堆内存中，与其说是“二维数组”，倒不如说是“二级数组”，第一维数组更像是索引，指向若干个随机分布的第二维数组起始地址：</p><p></p><figure><img src="/blog-assets/images/Java/2DArray.png" alt="2DArray.png" /><figcaption>2DArray.png</figcaption></figure><p></p><hr /><p>最后如果更加详细地查看每个数组的属性和方法，会发现Object类的方法它基本都有，并且还额外多了一些很有用的属性（例如<code>length</code>）。因此，在Java层面，完全可以把数组当成对象看待。</p></section><section><h2>HashMap<a href="#hashmap"><span>#</span></a></h2><section><h3>底层实现<a href="#底层实现"><span>#</span></a></h3><ul>
<li>结构
来看源代码中HashMap的实现：</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>transient</span><span> </span><span>Node</span><span>&lt;</span><span>K</span><span>,</span><span>V</span><span><span>&gt;</span><span>[] table</span></span><span>;</span></div></div><div><div><div>2</div></div><div><span>static</span><span> </span><span>class</span><span><span> </span><span>Node</span><span>&lt;</span><span>K</span><span>,</span><span>V</span><span>&gt;</span><span> </span></span><span>implements</span><span><span> </span><span>Map</span><span>.</span><span>Entry</span><span>&lt;</span><span>K</span><span>,</span><span>V</span><span>&gt;</span><span> </span></span><span>{</span></div></div><div><div><div>3</div></div><div><span>    </span><span>final</span><span> </span><span>int</span><span> hash</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>final</span><span> </span><span>K</span><span> key</span><span>;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>V</span><span> value</span><span>;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>Node</span><span>&lt;</span><span>K</span><span>,</span><span>V</span><span><span>&gt;</span><span> next</span></span><span>;</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>可以看到 HashMap 内部存储使用了一个 Node 数组(默认大小是16)，而 Node 类包含一个类型为 Node 的 next 的变量，也就是相当于一个链表。所有根据 hash 值计算的 bucket 一样的 key 会存储到同一个链表里。
从jdk 1.8开始，中如果 hash 值相同的 key 数量大于指定值(默认是8)时，会使用红黑树来代替链表，这会将get()方法的性能从O(n)提高到O(logn)。</li>
<li>插入元素
在jdk 1.7以及之前，HashMap插入元素到单链表时，采用头插入法，在扩容时需要重新计算哈希值和索引位置，会改变链表中元素原本的顺序，以至于在并发场景下有可能导致链表成环。而从jdk1.8开始，HashMap采用尾插入法，在扩容时会保持链表元素原本的顺序，就不会出现链表成环的问题了。
元素插入时，流程图如下：</li>
</ul><p></p><figure><img src="/blog-assets/images/Java/hashmap-put.png" alt="hashmap-put.png" /><figcaption>hashmap-put.png</figcaption></figure><p></p></section><section><h3>hash算法<a href="#hash算法"><span>#</span></a></h3><p>不管增加、删除、查找键值对，定位到哈希桶数组的位置都是很关键的第一步。当我们用hash算法求得这个位置的时候，马上就可以知道对应位置的元素就是我们要的，不用遍历链表，大大优化了查询的效率。HashMap定位数组索引位置，直接决定了hash方法的离散性能。这里的Hash算法本质上就是三步：取key的hashCode值、高位运算、取模运算。</p><p>JDK 1.8开始，优化了高位运算的算法，通过hashCode()的高16位异或低16位实现的：(h = k.hashCode()) ^ (h &gt;&gt;&gt; 16)，主要是从速度、功效、质量来考虑的，这么做可以在数组table的length比较小的时候，也能保证考虑到高低Bit都参与到Hash的计算中，同时不会有太大的开销。</p><p>对于任意给定的对象，只要它的hashCode()返回值相同，那么程序调用方法一所计算得到的Hash码值总是相同的。</p></section><section><h3>自动扩容机制<a href="#自动扩容机制"><span>#</span></a></h3><p>HashMap 内部的 Node 数组默认的大小是16。</p><p>假设有100万个元素，那么最好的情况下每个 hash 桶里都有62500个元素，这时get(), put(), remove()等方法效率都会降低。为了解决这个问题，HashMap 提供了自动扩容机制，当元素个数达到数组大小 loadFactor 后会扩大数组的大小，在默认情况下，数组大小为16，loadFactor 为0.75，也就是说当 HashMap 中的元素超过16<em>0.75=12时，会把数组大小扩展为2</em>16=32，并且计算每个元素在新数组中的位置。</p><p>使用2的幂次，有两个主要原因：</p><ul>
<li>方便hash算法中的位运算</li>
<li>扩容后元素均匀分布。元素的位置要么是在原位置，要么是在原位置再移动2次幂的位置。在扩充HashMap的时候，不需要重新计算hash。假如table扩容后的长度为n，只需要把n-1和原来的hash值按位与，看结果hash值高位新增的那个bit是1还是0就好了，是0的话索引没变，是1的话索引变成“原索引 + oldCap”。由于新增的1bit是0还是1可以认为是随机的，因此resize的过程，均匀的把之前的冲突的节点分散到新的bucket了。</li>
</ul></section><section><h3>线程安全性<a href="#线程安全性"><span>#</span></a></h3><p>不安全。考虑以下两个场景：</p><ul>
<li>如果多个线程同时使用put方法添加元素，而且假设正好存在两个 put 的 key 发生了碰撞(根据 hash 值计算的 bucket 一样)，那么根据 HashMap 的实现，这两个 key 会添加到数组的同一个位置，这样最终就会发生其中一个线程的 put 的数据被覆盖。</li>
<li>如果多个线程同时检测到元素个数超过数组大小 * loadFactor ，这样就会发生多个线程同时对 Node 数组进行扩容，都在重新计算元素位置以及复制数据，但是最终只有一个线程扩容后的数组会赋给 table，也就是说其他线程的都会丢失，并且各自线程 put 的数据也丢失。最糟糕的是，并发甚至可能导致死循环，因为多线程会导致 HashMap 的 Node 链表形成环形数据结构，Node 的 next 节点永远不为空。</li>
</ul><p>有三种常见解决方式：</p><ul>
<li>Hashtable
源码中是使用 synchronized 来保证线程安全的，当一个线程访问 HashTable 的同步方法时，其他线程如果也要访问同步方法，会被阻塞住。这种方法安全，但是效率很低</li>
<li>SynchronizedMap
同步整个对象，每一次的读写操作都需要加锁，对整个对象加锁会极大降低性能</li>
<li>ConcurrentHashMap，性能比起前两个优越很多
<ul>
<li>基础数据结构与HashMap类似，JDK1.7及以前是 数组 + 链表，JDK1.8开始是 数组 + 链表 + 红黑树</li>
<li>JDK 1.7以及之前，ConcurrentHashMap依靠HashEntry[] + Segment[] + ReentrantLock实现了分段锁，也就是将Map分割成了不同的部分，每个Segment对应若干个HashEntry，在执行更新操作时每个Segment使用单独的ReentrantLock。根据默认的并发级别(concurrency level，也就是Segment数组的长度)，Map被分割成16个部分，并且由不同的锁控制。这意味着同时可以有16个写线程操作Map。
<ul>
<li>进行put操作时，ConcurrentHashMap会尝试自旋获取锁，如果获取失败肯定就有其他线程存在竞争；如果重试的次数达到了 MAX_SCAN_RETRIES 则改为阻塞锁获取，保证能获取成功</li>
</ul>
</li>
<li>JDK 1.8开始，由于Segment分段锁的诸多缺点（多个分段锁浪费内存空间，实际生产环境中插入新元素竞争同一个锁的概率非常小，GC效率低），ConcurrentHashMap改用了 CAS(Compare And Swap，当且仅当旧预期值和当前内存值相同时，写入新内存值) + synchronized 来保证并发安全性，此外将HashEntry改为了Node，但作用基本相同。
<ul>
<li>进行put操作时，通过hashCode定位出Node，如果为空就用CAS机制尝试写入，写入失败就自旋保证成功；也有可能通过计算出来的hashCode值是MOVED(-1)，需要扩容；如果这些都不满足，就需要用synchronized锁保证写入数据。</li>
</ul>
</li>
<li>允许并发的读操作，JDK 1.7以及之前只需要将 Key 通过 Hash 之后定位到具体的 Segment ，再通过一次 Hash 定位到具体的元素上；JDK 1.8之后也是通过hashCode寻址，看元素具体是在桶上、链表上还是红黑树上决定对应的遍历获取方式。读操作是非常高效的，因为整个过程都不需要加锁，这要归功于volatile关键字，使用它会强制将修改的值立即写入主内存，当线程2进行修改时，会导致线程1的工作内存中缓存变量的缓存行无效（反映到硬件层的话，就是CPU的L1或者L2缓存中对应的缓存行无效），这时线程1如果需要读取变量的值时，只能去主存读取最新值。ConcurrentHashMap中，volatile修饰了每个Node的val值以及next指针，使得线程之间具有了可见性</li>
<li>如果一个线程在遍历的同时，另一个线程尝试进行修改，ConcurrentHashMap不会抛出ConcurrentModificationException并终止遍历（快速失败）。迭代前，ConcurrentHashMap先复制了原有集合内容，并在拷贝的集合上进行遍历，所以在遍历过程中对原集合所作的修改并不能被迭代器检测到（安全失败）</li>
</ul>
</li>
</ul></section></section><section><h2>ArrayList<a href="#arraylist"><span>#</span></a></h2><section><h3>特点<a href="#特点"><span>#</span></a></h3><p>ArrayList是容量能动态增长的动态数组。</p><ul>
<li>继承了AbstractList，实现了List。它是一个数组队列，提供了相关的添加、删除、修改、遍历等功能</li>
<li>实现了RandmoAccess接口，提供了随机访问功能，因此可以通过元素的序号快速获取元素对象</li>
<li>实现了Cloneable接口，能被克隆</li>
<li>实现java.io.Serializable接口，这意味着ArrayList支持序列化，能通过序列化去传输</li>
</ul><p>底层实现：Object[]数组 + size</p><ul>
<li>elementData，实质是”Object[]类型的数组”，它保存了添加到ArrayList中的元素。我们能通过构造函数来设定它的initialCapacity</li>
<li>size变量，用于记录当前数组的实际长度</li>
</ul></section><section><h3>扩容机制<a href="#扩容机制"><span>#</span></a></h3><p>添加新元素时，发现所需的最小minCapacity大于现有elementData的长度，需要调用Arrays.copyOf方法，给elementData赋值一个新的扩容数组。扩容后的newCapacity = oldCapacity + (oldCapacity &gt;&gt; 1)，也就是增长了原来的50%。</p></section></section><section><h2>LinkedList<a href="#linkedlist"><span>#</span></a></h2><section><h3>特点<a href="#特点-1"><span>#</span></a></h3><p>LinkedList是一个双向链表。</p><p>底层实现：两个Node引用 + size</p><ul>
<li>first: 指向链表头元素</li>
<li>last: 指向链表尾元素</li>
<li>size: 链表长度</li>
<li>Node：每个元素内部维护前后指针prev和next，还有值item</li>
</ul></section><section><h3>LinkedList和ArrayList删除性能对比<a href="#linkedlist和arraylist删除性能对比"><span>#</span></a></h3><p>理论而言，ArrayList查找访问快，增删效率低(O(n))；LinkedList查找访问慢，增删效率高(O(1))。实际而言，需要考虑这些场景：</p><ul>
<li>如果操作的元素在List尾部，比如删掉尾元素，那么二者的性能是完全一致的，都是O(1)</li>
<li>对于ArrayList删除来说，耗时的操作在于List中间插入元素后，后续元素需要通过System.arrayCopy()进行复制；而对于LinkedList，需要先循环遍历到目标Node，找到之后通过修改其前后节点的引用将这个Node从链表上移除。因此待删除元素在数组中的位置十分重要，这关系到实际删除的时间是多半花在查找元素还是删除上</li>
<li>由于System.arrayCopy()是原生方法优化不错，因此如果需要复制的元素个数不多，这个复制是非常快的，实战中可能比LinkedList的直接循环还快，这使得ArrayList在某些时候删除元素比LinkedList快</li>
</ul></section></section><section><h2>Vector<a href="#vector"><span>#</span></a></h2><section><h3>Vector和ArrayList的对比<a href="#vector和arraylist的对比"><span>#</span></a></h3><p>相同点：</p><ul>
<li>Vector和ArrayList都是动态数组，都支持动态扩容等特性</li>
<li>二者都继承了List类，底层都是通过数组实现的</li>
<li>添加、删除等方法中除了synchronized关键字的使用，具体实现是一致的</li>
</ul><p>主要区别：</p><ul>
<li>Vector是线程安全的（添加、删除等的方法的声明中，有synchronized关键字），支持同步访问；而ArrayList不是</li>
<li>ArrayList在底层数组不够用时，在原来的基础上拓展0.5倍，而Vector拓展1倍</li>
</ul><p>鉴于Vector的加锁特点，单线程的环境中尽量使用ArrayList而不是Vector，否则性能很差。</p></section><section><h3></h3></section></section><section><h2>ArrayDeque<a href="#arraydeque"><span>#</span></a></h2><section><h3>特点<a href="#特点-2"><span>#</span></a></h3><p>提及ArrayDeque前，需要先介绍Java中的Deque接口。Deque的含义是“double ended queue”，即双端队列，它既可以当作栈使用，也可以当作队列使用。Deque的接口函数很多，但基本都是对对容器的两端进行操作，或添加，或删除，或查看。并且需要注意Deque中有两套接口，一套在操作失败时直接抛出异常，另一套则会返回空值。</p><p></p><figure><img src="/blog-assets/images/Java/array-deque-circular.png" alt="array-deque-circular.png" /><figcaption>array-deque-circular.png</figcaption></figure><p></p><p>ArrayDeque是Deque接口的一种实现，底层依赖于数组，为了满足可以同时在数组两端插入或删除元素的需求，该数组还必须是循环的，即<strong>循环数组（circular array）</strong>，也就是说数组的任何一点都可能被看作起点或者终点。常用的操作中，需要注意以下几点：</p><ul>
<li>插入、删除元素时的下标越界问题</li>
<li>插入元素时的扩容问题，其逻辑是申请一个更大的数组（原数组的两倍），然后将原数组复制过去。过程如下图所示</li>
</ul><p></p><figure><img src="/blog-assets/images/Java/array-deque-capacity.png" alt="array-deque-capacity.png" /><figcaption>array-deque-capacity.png</figcaption></figure><p></p><p>需要注意，ArrayDeque是非线程安全的，当多个线程同时使用的时候，需要程序员手动同步。另外，该容器不允许放入null元素。</p></section><section><h3>实现栈和队列<a href="#实现栈和队列"><span>#</span></a></h3><p>Deque 具备普通队列 FIFO 的功能，同时它也具备了 Stack 的 LIFO 功能，并且保留了 push 和 pop 函数，所以基于Deque的ArrayDeque实现可谓是生逢其时，恰到好处。</p><p>按照目前Java官方的说法，ArrayDeque经过了充足优化，同时适合实现栈和队列：</p><ul>
<li>
<p>Java中有一个栈的类(Stack)，但官方不推荐使用，这是因为Stack继承了Vector类。Vector类是较早Java代码中的遗留产物，因为同步锁等机制性能糟糕。而Stack 和 Vector 本来毫无关系，然而为了复用 Vector 中的方法来实现进栈、出栈等操作，被迫继承了 Vector，这使得 Stack 在基于数组实现上效率受影响。此外由于Stack继承了Vector，导致Stack可以复用Vector中的很多操作，这也使得Stack类设计不严谨</p>
</li>
<li>
<p>Java中没有队列类Queue，但是有Queue接口，实现时首选ArrayDeque，次选LinkedList。这是由于链表每次插入和删除都涉及到一个节点对象的创建和弃用，非常低效和浪费空间，而动态数组几乎是0花费的(数组扩容拷贝除外)；此外链表不连续，在利用CPU缓存时不如数组方便</p>
</li>
</ul><p>Java中的栈、队列创建方法：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Deque</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> stack </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayDeque</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>2</div></div><div><span>Deque</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> queue </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayDeque</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span>()</span><span>;</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section>
<section><h1>JVM<a href="#jvm"><span>#</span></a></h1><section><h2>内存模型<a href="#内存模型"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Java/jvm-memory.jpg" alt="jvm-memory.jpg" /><figcaption>jvm-memory.jpg</figcaption></figure><p></p><p>JVM的内存结构大概分为：</p><ul>
<li>堆（Heap）：线程共享。所有的对象实例以及数组都要在堆上分配，存放对象实例和数组，也是回收器主要管理的对象</li>
<li>方法区（Method Area）：线程共享。存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据</li>
<li>方法栈（JVM Stack）：线程私有。存储局部变量表、操作栈、动态链接、方法出口、对象指针、基本数据类型、对象引用</li>
<li>本地方法栈（Native Method Stack）：线程私有。为虚拟机使用到的Native方法服务。如Java使用C或者C++编写的接口服务时，代码在此区运行</li>
<li>程序计数器（Program Counter Register）：线程私有。它可以看作是当前线程所执行的字节码的行号指示器。指向下一条要执行的指令</li>
</ul></section><section><h2>类加载机制<a href="#类加载机制"><span>#</span></a></h2><section><h3>定义<a href="#定义"><span>#</span></a></h3><p>类加载：虚拟机把编译后的描述类的数据从Class文件加载到内存，并对数据进行校验、转换解析和初始化，最终形成可被虚拟机直接使用的Java类型的过程</p><p>在Java语言里面，类型的加载、连接和初始化过程都是在程序运行期完成的，从而通过牺牲一些性能开销来换取Java程序的高度灵活性，因为这个时候可以进行一些动态加载、扩展等等。</p></section><section><h3>流程<a href="#流程"><span>#</span></a></h3><p>类从被加载到虚拟机内存中开始、到卸载出内存为止，整个生命周期包括七个阶段：</p><ol>
<li>加载
<ul>
<li>通过类的全限定名来获取定义此类的二进制字节流</li>
<li>将该二进制字节流所代表的静态存储结构转化为方法区的运行时数据结构，数据存储数据结构由虚拟机自行定义</li>
<li>在内存中生成一个代表这个类的java.lang.Class对象，它将作为程序访问方法区中的这些类型数据的外部接口</li>
</ul>
</li>
<li>验证（链接第一阶段）
<ul>
<li>确保Class文件的字节流中包含的信息符合当前虚拟机的要求，并且不会危害虚拟机自身的安全，直接决定JVM能否承受恶意代码的攻击</li>
<li>文件格式：字节流是否符合Class文件格式的规范、以及是否能被当前版本的虚拟机处理</li>
<li>元数据：对类的元数据信息进行语义校验，保证不存在不符合Java语言规范的元数据信息</li>
<li>字节码： 对类的方法体进行校验分析，保证被校验类的方法在运行时不会做出危害虚拟机安全的事件</li>
<li>符号引用：对类自身以外（如常量池中的各种符号引用）的信息进行匹配性校验</li>
</ul>
</li>
<li>准备（链接第二阶段）
<ul>
<li>为类变量（静态变量）分配内存</li>
<li>设置类变量初始值：通常情况下零值</li>
</ul>
</li>
<li>解析（链接第三阶段）
<ul>
<li>虚拟机将常量池内的符号引用替换为直接引用</li>
<li>符号引用：以一组符号来描述所引用的目标，可以是任何形式的字面量</li>
<li>直接引用：可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄</li>
</ul>
</li>
<li>初始化
<ul>
<li>真正执行类中定义的Java代码，根据 Java 程序的设定去初始化类变量和其他资源</li>
</ul>
</li>
<li>使用
<ul>
<li>JVM使用代码</li>
</ul>
</li>
<li>卸载（Java虚拟机结束生命周期）
<ul>
<li>执行了System.exit()方法</li>
<li>程序正常执行结束</li>
<li>程序在执行过程中遇到了异常或错误而异常终止</li>
<li>操作系统出现错误而导致Java虚拟机进程终止</li>
</ul>
</li>
</ol></section><section><h3>双亲委派机制<a href="#双亲委派机制"><span>#</span></a></h3><p>JVM提供了三种类加载器将class文件给加载到JVM中去执行：</p><ul>
<li>Bootstrap classLoader：主要负责加载核心的类库(java.lang.*等)，构造ExtClassLoader和APPClassLoader。</li>
<li>Extension classLoader：主要负责加载jre/lib/ext目录下的一些扩展的jar。</li>
<li>Application classLoader：主要负责加载应用程序的主函数类</li>
</ul><p>除此之外，还有自定义的类加载器User classLoader，它们之间的层次关系被称为类加载器的双亲委派模型。该模型要求除了顶层的启动类加载器外，其余的类加载器都应该有自己的父类加载器，而这种父子关系一般通过组合（Composition）关系来实现。</p><p>某个特定的类加载器在接到加载类的请求时，首先将加载任务委托给父类加载器，依次递归，如果父类加载器可以完成类加载任务，就成功返回，自己不重复加载；只有父类加载器无法完成此加载任务时，才自己去加载。</p><p>使用双亲委派模型的好处在于Java类随着它的类加载器一起具备了一种带有优先级的层次关系。无论哪一个类加载器要加载某个类，最终都是委派给处于模型最顶端的Bootstrap ClassLoader进行加载，因此Object类在程序的各种类加载器环境中都是同一个类，这样可以避免产生多个Object类导致混乱。</p><p>此外双亲委派模型更加安全，假如有人想替换某个系统级别的类，篡改它的实现。然而双亲委派模型下，这些系统类已经被Bootstrap classLoader加载过了，其他类加载器没有机会再去加载，从一定程度上防止了危险代码的植入。</p></section></section><section><h2>Synchronized<a href="#synchronized"><span>#</span></a></h2><p>synchronized是Java中的关键字，是一种同步锁，常用于多线程编程。它修饰的对象有以下几种：</p><ol>
<li>修饰一个代码块，被修饰的代码块称为同步语句块，其作用的范围是大括号{}括起来的代码，作用的对象是调用这个代码块的对象</li>
<li>修饰一个方法，被修饰的方法称为同步方法，其作用的范围是整个方法，作用的对象是调用这个方法的对象</li>
<li>修改一个静态的方法，其作用的范围是整个静态方法，作用的对象是这个类的所有对象</li>
<li>修改一个类，其作用的范围是synchronized后面括号括起来的部分，作用主的对象是这个类的所有对象</li>
</ol><section><h3>底层实现<a href="#底层实现-1"><span>#</span></a></h3><p>synchronized是通过monitorenter、monitorexit、ACC_SYNCHRONIZED实现同步的。</p><ul>
<li>monitorenter：每个对象都与一个monitor 相关联。当且仅当拥有所有者时（被拥有），monitor才会被锁定。执行到monitorenter指令的线程，会尝试去获得对应的monitor
<ul>
<li>每个对象维护着一个记录着被锁次数的计数器, 对象未被锁定时，该计数器为0。线程进入monitor（执行monitorenter指令）时，会把计数器设置为1</li>
<li>当同一个线程再次获得该对象的锁的时候，计数器再次自增</li>
<li>当其他线程想获得该monitor的时候，就会阻塞，直到计数器为0才能成功</li>
</ul>
</li>
<li>monitorexit：monitor的拥有者线程才能执行 monitorexit指令
<ul>
<li>线程执行monitorexit指令，就会让monitor的计数器减一。如果计数器为0，表明该线程不再拥有monitor。其他线程就允许尝试去获得该monitor了</li>
</ul>
</li>
<li>ACC_SYNCHRONIZED：同步方法的常量池中会有一个ACC_SYNCHRONIZED标志
<ul>
<li>当调用一个设置了ACC_SYNCHRONIZED标志的方法，执行线程需要先获得monitor锁，然后开始执行方法，方法执行之后再释放monitor锁，当方法不管是正常return还是抛出异常都会释放对应的monitor锁</li>
<li>在此期间，如果其他线程来请求执行方法，会因为无法获得监视器锁而被阻断住</li>
<li>方法执行过程中，发生了异常，并且方法内部并没有处理该异常，那么在异常被抛到方法外面之前监视器锁会被自动释放</li>
</ul>
</li>
</ul><p>monitor是由ObjectMonitor类来实现的，类中有两个队列 _EntryList和 _WaitSet，它们是用来保存ObjectMonitor对象列表， 还有一个_owner指针指向持有ObjectMonitor对象的线程。</p><ol>
<li>当多个线程访问同步代码时，线程会进入_EntryList区</li>
<li>当线程获取对象的monitor后进入 _Owner区并且将 _owner指向获得锁的线程(monitor对象被线程持有)， _count++，其他线程则继续在 _EntryList区等待</li>
<li>若线程调用wait方法，则该线程进入 _WaitSet区等待被唤醒。线程执行完后释放monitor锁并且对ObjectMonitor中的值进行复位</li>
</ol></section><section><h3>特性<a href="#特性"><span>#</span></a></h3><ul>
<li>有序性
<ul>
<li>as-if-serial：不管怎么重排序，单线程程序的执行结果都不能被改变</li>
</ul>
</li>
<li>可见性
<ul>
<li>happens-before：那么第一个操作的执行结果将对第二个操作可见，而且第一个操作的执行顺序排在第二个操作之前</li>
<li>内存强制刷新</li>
</ul>
</li>
<li>原子性
<ul>
<li>单一线程持有</li>
</ul>
</li>
<li>可重入性
<ul>
<li>每个锁关联一个线程持有者和一个计数器。当计数器为0时表示该锁没有被任何线程持有，那么任何线程都都可能获得该锁而调用相应方法。当一个线程请求成功后，JVM会记下持有锁的线程，并将计数器计为1。此时其他线程请求该锁，则必须等待。而该持有锁的线程如果再次请求这个锁，就可以再次拿到这个锁，同时计数器会递增。当线程退出一个synchronized方法/块时，计数器会递减，如果计数器为0则释放该锁</li>
</ul>
</li>
</ul></section><section><h3>对象<a href="#对象"><span>#</span></a></h3><p>在JVM中，对象在内存中的布局分为3块：对象头、实例数据和对齐填充。</p><ul>
<li>对象头：2个字宽(如果对象是数组则分配3个字宽，多的一个字宽用于存储数组的长度)
<ul>
<li>Mark Word：储存对象自身的运行时数据，例如对象的hashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程的ID、偏向时间戳等</li>
<li>类型指针：标识JVM通过这个指针来确定这个对象是哪个类的实例</li>
</ul>
</li>
<li>实例数据：对象真正的有效信息(程序代码中定义的各种类型的字段内容)</li>
<li>对齐填充：占位符，JVM要求对象的起始地址必须是8个字节的整数倍，而对象头已经是8的整数倍了，如果实例数据没有对齐就需要对齐填充来补全</li>
</ul><p>synchronized使用的锁都放在对象头里，在mark word中会有2个bit作为锁的标志位，用于标示当前对象持有的是什么状态的锁。</p></section><section><h3>锁升级（膨胀）<a href="#锁升级膨胀"><span>#</span></a></h3><p>锁的状态是通过对象监视器在对象头中的字段来表明的。状态会随着竞争的情况逐渐升级，而且是不可逆的过程，即不可降级。四种状态分别是：</p><ul>
<li>无锁状态</li>
<li>偏向锁状态：一段同步代码一直被一个线程所访问，那么该线程会自动获取锁。降低了获取锁的代价</li>
<li>轻量级锁状态：锁是偏向锁的时候，被另一个线程所访问，偏向锁就会升级为轻量级锁，其他线程会通过自旋的形式尝试获取锁，不会阻塞，提高性能</li>
<li>重量级锁状态：锁为轻量级锁的时候，另一个线程虽然是自旋，但自旋不会一直持续下去，当自旋一定次数的时候，还没有获取到锁，就会进入阻塞，该锁膨胀为重量级锁。重量级锁会让其他申请的线程进入阻塞，性能降低</li>
</ul><p>没有竞争出现时，默认会使用偏向锁。JVM 会利用 CAS 操作，在对象头上的 Mark Word 部分设置线程 ID，以表示这个对象偏向于当前线程，所以并不涉及真正的互斥锁。这样做的假设是基于在很多应用场景中，大部分对象生命周期中最多会被一个线程锁定，使用偏向锁可以降低无竞争开销。</p><p>如果有另外的线程试图锁定某个已经被偏向过的对象，JVM 就需要撤销（revoke）偏向锁，并切换到轻量级锁实现。轻量级锁依赖 CAS 操作 Mark Word ，修改指针来试图获取锁，并且复制了一份Mark Word叫做Lock Record。如果成功，就使用普通的轻量级锁；否则，进一步升级为重量级锁。</p></section><section><h3>和Lock的区别<a href="#和lock的区别"><span>#</span></a></h3><ul>
<li>synchronized是关键字，JVM底层已经有对应实现；Lock是一个接口，JDK层面有丰富的API</li>
<li>synchronized会自动释放锁；Lock需要手动释放</li>
<li>synchronized不可中断（如果A不释放，B将一直等下去，不能被中断）；Lock可以中断也可以不中断（如果A不释放，可以使B在等待了足够长的时间以后，中断等待，而干别的事情）</li>
<li>synchronized支持修饰的范围比较广，有代码块、方法、类等等；Lock只能锁住代码块</li>
<li>synchronized是非公平锁，而Lock可以公平也可以非公平</li>
<li>synchronized不能知道线程是否拿到了锁，而Lock可以通过tryLock的机制实现这个目的</li>
</ul></section></section><section><h2>自动装箱/拆箱<a href="#自动装箱拆箱"><span>#</span></a></h2><p>假如有这样两段代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Integer</span><span> i3 </span><span><span>=</span><span> </span></span><span>100</span><span>;</span></div></div><div><div><div>2</div></div><div><span>Integer</span><span> i4 </span><span><span>=</span><span> </span></span><span>100</span><span>;</span></div></div><div><div><div>3</div></div><div><span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span><span>(i3 </span><span>==</span><span> i4);</span><span> </span></span><span>// true</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>Integer</span><span> i5 </span><span><span>=</span><span> </span></span><span>1000</span><span>;</span></div></div><div><div><div>6</div></div><div><span>Integer</span><span> i6 </span><span><span>=</span><span> </span></span><span>1000</span><span>;</span></div></div><div><div><div>7</div></div><div><span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span><span>(i5 </span><span>==</span><span> i6);</span><span> </span></span><span>// false</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>为何会有上述差异？反编译.class文件，发现编译器实际上把上述代码进行了修改，添加了<code>valueOf</code>方法：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Integer</span><span> i1 </span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>valueOf</span><span>(</span><span>100</span><span>);</span></div></div><div><div><div>2</div></div><div><span>Integer</span><span> i2 </span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>valueOf</span><span>(</span><span>100</span><span>);</span></div></div><div><div><div>3</div></div><div><span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span><span>(i1 </span><span>==</span><span> i2);</span><span> </span></span><span>// true</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>Integer</span><span> i3 </span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>valueOf</span><span>(</span><span>1000</span><span>);</span></div></div><div><div><div>6</div></div><div><span>Integer</span><span> i4 </span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>valueOf</span><span>(</span><span>1000</span><span>);</span></div></div><div><div><div>7</div></div><div><span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span><span>(i3 </span><span>==</span><span> i4);</span><span> </span></span><span>// false</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>而<code>valueOf</code>方法的定义中，作者为了避免重复创建对象，对Integer值做了缓存，如果这个值在缓存范围内，直接返回<code>IntegerCache</code>类中缓存好的对象，否则new一个新的对象返回。</p><p>那么这个缓存范围是多少？<code>IntegerCache</code>这一内部静态类给出了解答。该类只能在Integer这个类的内部访问，这个类在初始化的时候，会去加载JVM的配置，如果有值，就用配置的值初始化缓存数组，否则就缓存-128到127之间的值。</p><p>回到开篇的代码差异。<code>i1</code>和<code>i2</code>赋值时，由于值在-128到-127之间，因此<code>i1</code>和<code>i2</code>指向的是同一个缓存对象；而<code>i3</code>和<code>i4</code>则new了两个不同的对象。</p><p>结论：比较两个Integer对象的值时，无论如何声明，一定要使用<code>equals()</code>比较，不能用<code>==</code>，并且注意Java中没有重载操作符这一说。</p><p>前文已经提到，JVM把声明的Integer类型变量加上了<code>valueOf()</code>方法。实际上，Java中广泛存在着这种行为。</p><p>Java中一共有四类八种基本数据类型，除掉这几种类型，其它的都是对象，也就是引用类型。而JDK1.5后，所有的基本数据类型都被加上了包装类型：</p><p>基本类型 -&gt; 包装类型</p><p>第一类：整型
byte -&gt; Byte,
short -&gt; Short,
int -&gt; Integer,
long -&gt; Long</p><p>第二类：浮点型
float -&gt; Float,
double -&gt; Double</p><p>第三类：逻辑型
boolean -&gt; Boolean</p><p>第四类：字符型
char -&gt; Character</p><p>基本类型和包装类型之间可以互相转化：</p><ul>
<li>将int的变量转换成Integer对象，这个过程叫做装箱（boxing）</li>
<li>将Integer对象转换成int类型值，这个过程叫做拆箱（unboxing）</li>
</ul><p>假如我们有如下代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Integer</span><span> integer1 </span><span><span>=</span><span> </span></span><span>100</span><span>;</span></div></div><div><div><div>2</div></div><div><span>int</span><span> int1 </span><span><span>=</span><span> integer1</span><span>;</span></span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>Long</span><span> long1 </span><span><span>=</span><span> </span></span><span>100L</span><span>;</span></div></div><div><div><div>5</div></div><div><span>long</span><span> l1 </span><span><span>=</span><span> long1</span><span>;</span></span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>Boolean</span><span> boolean1 </span><span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>8</div></div><div><span>boolean</span><span> bool1 </span><span><span>=</span><span> boolean1</span><span>;</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>反编译后，会发现代码变成：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Integer</span><span> integer1 </span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>valueOf</span><span>(</span><span>100</span><span><span>);</span><span> </span></span><span>// 对int类型的值100装箱</span></div></div><div><div><div>2</div></div><div><span>int</span><span> int1 </span><span><span>=</span><span> </span></span><span>integer1</span><span>.</span><span>intValue</span><span><span>();</span><span> </span></span><span>// 对象类型integer1拆箱</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>Long</span><span> long1 </span><span><span>=</span><span> </span></span><span>Long</span><span>.</span><span>valueOf</span><span>(</span><span>100L</span><span><span>);</span><span> </span></span><span>// 对long类型的值100L装箱</span></div></div><div><div><div>5</div></div><div><span>long</span><span> l1 </span><span><span>=</span><span> </span></span><span>long1</span><span>.</span><span>longValue</span><span><span>();</span><span> </span></span><span>// 对象类型l1拆箱</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>Boolean</span><span> boolean1 </span><span><span>=</span><span> </span></span><span>Boolean</span><span>.</span><span>valueOf</span><span>(</span><span>true</span><span><span>);</span><span> </span></span><span>// 对int类型的值true装箱</span></div></div><div><div><div>8</div></div><div><span>boolean</span><span> bool1 </span><span><span>=</span><span> </span></span><span>boolean1</span><span>.</span><span>booleanValue</span><span><span>();</span><span> </span></span><span>// 对象类型boolean1拆箱</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>为什么要使用包装类型？</p><ul>
<li>对象是对现实世界的模拟（一切事物皆对象，通过面向对象的方式，将现实世界的事物抽象成对象）</li>
<li>为泛型提供支持，例如<code>List&lt;Integer&gt; list = new ArrayList&lt;Integer&gt;()</code>这样的写法，因为泛型必须是一个对象</li>
<li>提供了丰富的属性和API，例如<code>Integer.MIN_VALUE</code>，<code>Integer.max(a, b)</code>等等</li>
</ul></section><section><h2>垃圾回收机制<a href="#垃圾回收机制"><span>#</span></a></h2><p>实质：垃圾指的是无任何对象引用的对象，垃圾回收指的是清理“垃圾”占用的内存空间。</p><section><h3>堆内存分配区域<a href="#堆内存分配区域"><span>#</span></a></h3><ul>
<li>新生代（Young Generation）
几乎所有新生成的对象首先都是放在年轻代的。新生代内存按照8:1&lt;1的比例分为一个eden区和两个survivor&gt;(Survivor0,Survivor1)区。大部分对象在Eden区中生成。当新对象生成，Eden Space申请失败（因为空间不足等），则会发起一次GC(Scavenge GC)。回收时先将Eden区存活对象复制到一个Survivor0区，然后清空Eden区，当这个Survivor0区也存放满了时，则将Eden区和Survivor0区存活对象复制到另一个Survivor1区，然后清空Eden和这个Survivor0区，此时Survivor0区是空的，然后将Survivor0区和Survivor1区交换，即保持Survivor1区为空，如此往复。当对象在Survivor区躲过一次GC的话，其对象年龄便会加1，如果经历N次垃圾回收仍然存活，就会被移到年老代</li>
<li>老生代（Old Generation）
年轻代中经历了N次垃圾回收后仍然存活的对象。此外，大对象一般会被直接分配到老年代。所谓的大对象是指需要大量连续存储空间的对象，最常见的一种大对象就是大数组</li>
</ul></section><section><h3>Java对象引用<a href="#java对象引用"><span>#</span></a></h3><ul>
<li>强引用（Strong Reference）：如<code>Object obj = new Object()</code>，这类引用是Java程序中最普遍的。只要强引用还存在，垃圾收集器就永远不会回收掉被引用的对象。</li>
<li>软引用（Soft Reference）：它用来描述一些可能还有用，但并非必须的对象。在系统内存不够用时，这类引用关联的对象将被垃圾收集器回收。</li>
<li>弱引用（Weak Reference）：它也是用来描述非须对象的，但它的强度比软引用更弱些，被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时，无论当前内存是否足够，都会回收掉只被弱引用关联的对象。</li>
<li>虚引用（Phantom Reference）：最弱的一种引用关系，完全不会对其生存时间构成影响，也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的是希望能在这个对象被收集器回收时收到一个系统通知。</li>
</ul></section><section><h3>如何判断某个对象是垃圾<a href="#如何判断某个对象是垃圾"><span>#</span></a></h3><ul>
<li>引用计数
堆中每个对象都有一个引用计数器。当一个对象被创建并初始化赋值后，该变量计数设置为1。每当有一个地方引用它时，计数器值就加1（a = b， b被引用，则b引用的对象计数+1）。当引用失效时（一个对象的某个引用超过了生命周期（出作用域后）或者被设置为一个新值时），计数器值就减1。任何引用计数为0的对象可以被当作垃圾收集。
缺点：难以检测出对象之间的循环引用。同时，引用计数器增加了程序执行的开销</li>
<li>根搜索算法：
通过一系列名为“GC Roots”的对象作为起始点，寻找对应的引用节点；找到这些引用节点后，从这些节点开始向下继续寻找它们的引用节点，不断重复这个过程。当标记阶段完成了之后，所有的存活对象都已经被找出来了。其它的那些也是GC根对象不可达的对象，也就是说应用不会再用到它们了。这些就是垃圾对象，回收器将会在接下来的阶段中清除它们。
在遍历过程中，垃圾回收器会对内存中的整个对象图进行遍历，它先从GC根对象开始，然后是根对象引用的其它对象，比如实例变量。回收器将访问到的所有对象都标记为存活。</li>
</ul></section><section><h3>回收垃圾算法<a href="#回收垃圾算法"><span>#</span></a></h3><ul>
<li>标记-清除算法
标记出所需回收的对象，在标记完成后统一回收掉所有被标记的对象，它的标记过程其实就是前面的根搜索算法中判定垃圾对象的标记过程。一般适用于老生代
<ul>
<li>优点：不需要进行对象的移动，存活对象多的时候很高效</li>
<li>缺点：标记清除后会产生大量不连续的内存碎片</li>
</ul>
</li>
<li>标记—整理算法
对标记后出的垃圾对象的处理情况有所不同，它不是直接对可回收对象进行清理，而是让所有的对象都向一端移动，然后直接清理掉端边界以外的内存。一般适用于老生代
<ul>
<li>优点：解决碎片问题，并且只需要使用指针碰撞（把指针分界线向未分配内存空间移动一个对象的大小）就能给新对象分配内存</li>
<li>缺点：增加了GC的耗时</li>
</ul>
</li>
<li>复制算法
将内存按容量分为大小相等的两块，每次只使用其中的一块（对象面），当这一块的内存用完了，就将还存活着的对象复制到另外一块内存上面（空闲面），然后再把已使用过的内存空间一次清理掉。一般适用于新生代
<ul>
<li>优点：标记阶段和复制阶段可以同时进行；内存回收时不用考虑内存碎片的出现</li>
<li>缺点：需要一块能容纳下所有存活对象的额外的内存空间，一次性最大分配内存减半</li>
</ul>
</li>
</ul></section><section><h3>垃圾回收过程细节<a href="#垃圾回收过程细节"><span>#</span></a></h3><ol>
<li>
<p>什么时候？</p>
<ul>
<li>
<p>新生代GC（Minor GC/Scavenge GC）：发生在新生代的垃圾收集动作。因为Java对象大多都具有朝生夕灭的特性，因此Minor GC非常频繁(不一定等Eden区满了才触发)，一般回收速度也比较快。在新生代中，每次垃圾收集时都会发现有大量对象死去，只有少量存活，因此可选用复制算法来完成收集。</p>
</li>
<li>
<p>老年代GC（Major GC/Full GC）：发生在老年代的垃圾回收动作。Major GC，经常会伴随至少一次Minor GC。由于老年代中的对象生命周期比较长，因此Major GC并不频繁，一般都是升到老年代的对象大于老年代剩余空间时进行，而且其速度一般会比Minor GC慢10倍以上。另外，如果分配了Direct Memory，在老年代中进行Full GC时，会顺便清理掉Direct Memory中的废弃对象。而老年代中因为对象存活率高、没有额外空间对它进行分配担保，就必须使用标记—清除算法或标记—整理算法来进行回收。</p>
</li>
<li>
<p>新生代采用空闲指针的方式来控制GC触发，指针保持最后一个分配的对象在新生代区间的位置，当有新的对象要分配内存时，用于检查空间是否足够，不够就触发GC。当连续分配对象时，对象会逐渐从Eden到Survivor，最后到老年代。当老年代也满了后，就会报OutOfMemory的异常。注意，如果gc与非gc时间耗时过大，超过了GCTimeRatio的限制，也会引发OutOfMemory异常。</p>
</li>
</ul>
</li>
<li>
<p>对什么东西？</p>
<p>从root搜索不到，而且经过第一次标记、清理后，仍然没有复活的对象。</p>
</li>
<li>
<p>做了什么事情？</p>
<p>新生代做的是复制清理、from survivor、to survivor是干啥用的、老年代做的是标记清理、标记清理后碎片要不要整理</p>
</li>
</ol></section><section><h3>Java垃圾回收器种类<a href="#java垃圾回收器种类"><span>#</span></a></h3><ul>
<li>串行垃圾回收器
持有应用程序所有的线程进行工作。它为单线程环境设计，只使用一个单独的线程进行垃圾回收，通过冻结所有应用程序线程进行工作</li>
<li>并行垃圾回收器
JVM的默认垃圾回收器，使用多线程进行垃圾回收。当执行垃圾回收的时候它也会冻结所有的应用程序线程。</li>
<li>并发标记扫描垃圾回收器
使用多线程扫描堆内存，标记需要清理的实例并且清理被标记过的实例。并发标记垃圾回收器只会在下面两种情况持有应用程序所有线程：
<ul>
<li>当标记的引用对象在Tenured区域</li>
<li>在进行垃圾回收的时候，堆内存的数据被并发的改变</li>
</ul>
</li>
</ul></section><section><h3>STW<a href="#stw"><span>#</span></a></h3><p>Stop The World，整个Java虚拟机应用线程暂停工作。在标记或者计算的过程中如果还有新对象产生，这个时候就需要STW。暂停工作吧，先把垃圾处理完。</p></section></section><section><h2>OOM错误种类<a href="#oom错误种类"><span>#</span></a></h2><section><h3>Java heap space<a href="#java-heap-space"><span>#</span></a></h3><p>应用程序尝试添加更多的数据放入堆空间区域，但没有足够的空间供它使用。引起错误的可能原因：</p><ul>
<li>用量/数据量激增</li>
<li>内存泄漏</li>
</ul><p>解决方案：</p><ul>
<li>分配更多的堆</li>
<li>排查是否有内存泄漏</li>
</ul></section><section><h3>GC overhead limit exceeded<a href="#gc-overhead-limit-exceeded"><span>#</span></a></h3><p>应用程序已经耗尽了几乎所有的可用内存，并且GC一直未能回收它。引起错误的可能原因：</p><ul>
<li>应用程序花费太多的时间做垃圾收集，清理的时间太少，可能是因为堆太小</li>
</ul><p>解决方案：</p><ul>
<li>分配更多的堆</li>
</ul></section><section><h3>PermGen space<a href="#permgen-space"><span>#</span></a></h3><p>永久代的内存区域被耗尽。引起错误的可能原因：</p><ul>
<li>永久区中装入了太多的类或太大的类</li>
</ul><p>解决方案：</p><ul>
<li>增大内存</li>
<li>检查是否存在类加载器泄漏</li>
<li>检查是否设置允许GC从PermGen space卸载类</li>
</ul></section><section><h3>Unable to create new native thread<a href="#unable-to-create-new-native-thread"><span>#</span></a></h3><p>Java应用程序已达到其可以启动线程数的限制。引起错误的可能原因：</p><ul>
<li>Java进程大小已耗尽其内存地址空间</li>
<li>操作系统的虚拟内存已完全耗尽</li>
</ul><p>解决方案：</p><ul>
<li>增加操作系统级别的数量限制来绕过无法创建新的本机线程问题</li>
<li>减少线程创建</li>
</ul></section></section><section><h2>JVM性能调优<a href="#jvm性能调优"><span>#</span></a></h2><section><h3>原则<a href="#原则"><span>#</span></a></h3><p>多数的 Java 应用不需要在服务器上进行 GC 优化； 多数导致 GC 问题的 Java 应用，都不是因为我们参数设置错误，而是代码问题； 在应用上线之前，先考虑将机器的 JVM 参数设置到最优（最适合）； 减少创建对象的数量； 减少使用全局变量和大对象； GC 优化是到最后不得已才采用的手段； 在实际使用中，分析 GC 情况优化代码比优化 GC 参数要多得多。</p><p>总体而言，GC的目的是将转移到老年代的对象数量降低到最小； 减少 GC 的执行时间。</p></section><section><h3>触发时机<a href="#触发时机"><span>#</span></a></h3><ul>
<li>Heap内存（老年代）持续上涨达到设置的最大内存值</li>
<li>Full GC 次数频繁</li>
<li>GC 停顿时间过长（超过1秒）</li>
<li>应用出现OutOfMemory 等内存异常</li>
<li>应用中有使用本地缓存且占用大量内存空间</li>
<li>系统吞吐量与响应性能不高或下降</li>
</ul></section><section><h3>一般步骤<a href="#一般步骤"><span>#</span></a></h3><ol>
<li>分析GC日志及dump文件，判断是否需要优化，确定瓶颈问题点</li>
<li>确定JVM调优量化目标</li>
<li>确定JVM调优参数（根据历史JVM参数来调整）</li>
<li>依次调优内存、延迟、吞吐量等指标</li>
<li>对比观察调优前后的差异</li>
<li>不断的分析和调整，直到找到合适的JVM参数配置</li>
<li>找到最合适的参数，将这些参数应用到所有服务器，并进行后续跟踪</li>
</ol></section><section><h3>GC调优<a href="#gc调优"><span>#</span></a></h3><ol>
<li>将新对象预留在新生代，由于 Full GC 的成本远高于 Minor GC，因此尽可能将对象分配在新生代是明智的做法，实际项目中根据 GC 日志分析新生代空间大小分配是否合理，适当通过“-Xmn”命令调节新生代大小，最大限度降低新对象直接进入老年代的情况。</li>
<li>大对象进入老年代，虽然大部分情况下，将对象分配在新生代是合理的。但是对于大对象这种做法却值得商榷，大对象如果首次在新生代分配可能会出现空间不足导致很多年龄不够的小对象被分配的老年代，破坏新生代的对象结构，可能会出现频繁的 full gc。因此，对于大对象，可以设置直接进入老年代（当然短命的大对象对于垃圾回收来说简直就是噩梦）。-XX 可以设置直接进入老年代的对象大小。</li>
<li>合理设置进入老年代对象的年龄，-XX 设置对象进入老年代的年龄大小，减少老年代的内存占用，降低 full gc 发生的频率。</li>
<li>设置稳定的堆大小，堆大小设置有两个参数：-Xms 初始化堆大小，-Xmx 最大堆大小。</li>
<li>注意： 如果满足下面的指标，则一般不需要进行 GC 优化：
MinorGC 执行时间不到50ms； Minor GC 执行不频繁，约10秒一次； Full GC 执行时间不到1s； Full GC 执行频率不算频繁，不低于10分钟1次。</li>
</ol></section><section><h3>Full GC内存泄漏排查<a href="#full-gc内存泄漏排查"><span>#</span></a></h3><ul>
<li>jmap 手动dump出文件进行分析</li>
<li>用jvisualvm等工具监控配置，自动dump</li>
<li>使用Memory Analyzer（MAT）等工具实时查看分析内存使用情况</li>
</ul></section></section></section>
<section><h1>String类<a href="#string类"><span>#</span></a></h1><p>String类的对象在声明时，主要生成了两个重要的东西：</p><ul>
<li><code>private final char value[]</code>，这同时说明Java的String是基于char[]的</li>
<li><code>private int hash</code>，即String的hashCode</li>
</ul><p>构造函数则是这样写的：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>String</span><span>(</span><span>String</span><span> original) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>this</span><span>.</span><span>value</span><span><span> </span><span>=</span><span> </span></span><span>original</span><span>.</span><span>value</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>this</span><span>.</span><span>hash</span><span><span> </span><span>=</span><span> </span></span><span>original</span><span>.</span><span>hash</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>结合一个例子理解上述的构造过程：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>String</span><span> str1 </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>String</span><span>(</span><span>"abc"</span><span><span>)</span><span>;</span></span></div></div><div><div><div>2</div></div><div><span>String</span><span> str2 </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>String</span><span>(</span><span>"abc"</span><span><span>)</span><span>;</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>流程：</p><ol>
<li>JVM会去先检查看一看常量池里有没有”abc”这个对象，如果没有，把”abc”初始化为对象放入常量池，如果有，直接返回常量池内容</li>
<li>处理<code>new</code>关键词，在堆内存中开辟空间，由于hash这个字段是int类型的，成员变量初始化默认值为0</li>
<li>处理构造函数，hash是值类型，直接赋值，数组为引用类型，直接指向常量池中的地址。</li>
<li><code>str2</code>类似，直接使用常量池中的结果</li>
</ol><p></p><figure><img src="/blog-assets/images/Java/stringConstruct.png" alt="stringConstruct.png" /><figcaption>stringConstruct.png</figcaption></figure><p></p><p>再看另一段代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>String</span><span> s1 </span><span><span>=</span><span> </span></span><span>"100"</span><span>;</span></div></div><div><div><div>2</div></div><div><span>String</span><span> s2 </span><span><span>=</span><span> </span></span><span>"100"</span><span>;</span></div></div><div><div><div>3</div></div><div><span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span><span>(s1 </span><span>==</span><span> s2);</span><span> </span></span><span>// true</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>String</span><span> s3 </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>String</span><span>(</span><span>"100"</span><span><span>)</span><span>;</span></span></div></div><div><div><div>6</div></div><div><span>String</span><span> s4 </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>String</span><span>(</span><span>"100"</span><span><span>)</span><span>;</span></span></div></div><div><div><div>7</div></div><div><span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span><span>(s3 </span><span>==</span><span> s4);</span><span> </span></span><span>// false</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>再次出现了差异，并且反编译后发现与代码并没有被修改，与编译器无关。那么问题出在哪？答案是JVM的堆内存使用机制。</p><p>在JVM中，堆内存的一部分是常量池，主要的目的是为了避免频繁的创建和销毁对象而影响系统性能，实现了对象的共享。当代码执行到<code>String s1 = "100"</code>时，会先看常量池里有没有字符串刚好是“100”这个对象，如果没有，在常量池里创建初始化该对象，并把引用指向它；当执行到<code>String s2 = "100"</code>时，发现常量池已经有了”100”这个值，于是不会在常量池中创建一个新对象，而是把引用直接指向了原来的”100”对象。而<code>s3</code>和<code>s4</code>的创建就不同了，由于它们是使用<code>new</code>关键字构造的，因此构造时就是明确告诉JVM，要在堆内存开辟一块新内存。</p><p>一张图总结上述四个字符串生成时内存的使用情况：</p><p></p><figure><img src="/blog-assets/images/Java/memoryPool.png" alt="memoryPool.png" /><figcaption>memoryPool.png</figcaption></figure><p></p><p>结论：比较两个String对象的值时，无论如何声明，一定要使用<code>equals()</code>比较，不能用<code>==</code>，并且注意Java中没有重载操作符这一说。</p><hr /><p>在引用类型中，”==“是比较两个引用是否指向堆内存里的同一个地址（同一个对象），而equals是一个普通的方法，该方法返回的结果依赖于自身的实现。于是，我们不妨深究一下Java常见类中<code>equals()</code>方法的实现。</p><ul>
<li>如果一个类没有继承其他类，那么它默认继承自<code>Object</code>这个类。而<code>Object</code>类的<code>equals()</code>实现方法很简单，即：判断两个引用是否指向堆内存中的同一块地址（同一个对象）</li>
<li>而Integer类中，首先会判断传入比较的对象是不是Integer类型(<code>obj instanceof Integer</code>)，如果是，才会进行后续的值比较；否则直接返回false。因此，诸如Integer与Long之类的比较，即使值相等，也会直接返回false</li>
<li>String类中的<code>equals()</code>实现略微复杂：
<ul>
<li>先判断两个对象是否指向同一引用，如果是直接返回true</li>
<li>判断两个对象是否都是String类型</li>
<li>判断字符串底层char数组长度是否一致</li>
<li>循环检查数组每一个char字符是否相等</li>
</ul>
</li>
</ul></section>
<section><h1>面向对象<a href="#面向对象"><span>#</span></a></h1><p>面向对象三大特征：继承、多态、封装</p><ul>
<li>继承：重用父类的代码，一个大类下的诸多小类，如果他们有共同的性质，只需要写一遍即可，不用重复多次（动物 -&gt; 哺乳动物 -&gt; 人）</li>
<li>多态：多个小类同时继承一个大类，调用同一个方法时，运行时会智能匹配到子类的实现，得到不同的结果。需要满足三个条件：
<ul>
<li>要用继承关系</li>
<li>要有重写</li>
<li>父类引用指向子类对象，也就是向上转型(<code>Animal a = new Cat()</code>)，这样既可以使用子类改进拓展的功能，又可以抽取父类的共性</li>
</ul>
</li>
<li>封装：隐藏对象属性和实现细节，仅对外公开指定方法来控制程序中属性的访问和修改。几种修饰符：
<ul>
<li><code>private</code>：访问权限仅限于类的内部，不能被任何外部类访问</li>
<li><code>default</code>：任何处于当前包的类、接口等等都可以互相访问</li>
<li><code>protected</code>：访问权限仅限于子类，其他类不可以</li>
<li><code>public</code>：任何外部包、类都可以访问</li>
</ul>
</li>
</ul><hr /><p>所有的对象都是通过类来描绘的，但是反过来，并不是所有的类都是用来描绘对象的，如果一个类中没有包含足够的信息来描绘一个具体的对象，这样的类就是抽象类。由于抽象类不能实例化对象，所以抽象类必须被继承，才能被使用。也是因为这个原因，通常在设计阶段决定要不要设计抽象类。抽象类除了不能实例化对象之外，类的其它功能依然存在，成员变量、成员方法和构造方法的访问方式和普通类一样。</p><p>Java中使用<code>abstract class</code>定义抽象类。</p><p>如果某个类暂时不确定有属性或有具体的形为，建议先声明成接口，因为一个类可以实现多个接口，但只能继承一个类，声明为接口更灵活一些，也使实现类具有更好的扩展性。</p><hr /><p>重写和重载的区别：</p><ul>
<li>重写：指子类和父类的关系，子类重写了父类的方法，但方法名、参数类型、参数个数必须相同（加上<code>@Override1</code>）</li>
<li>重载：同一个类中，方法的名字相同，但参数个数、参数的类型不同。</li>
</ul><p>这里引申到了一个进阶的问题，即如何比较两个类对象。结论是：</p><ol>
<li>不要自己写方法，或者用<code>==</code>去判断，而是应该重写父类的 equals方法</li>
<li>当我们在实际业务中需要重写（覆盖）<code>equals()</code>方法时，根据规范，我们一定要重写（覆盖）<code>hashCode()</code>方法。</li>
</ol></section>
<section><h1>Java反射机制<a href="#java反射机制"><span>#</span></a></h1><ol>
<li>
<p><strong>什么是Java反射机制？</strong></p>
<p>一般情况下，我们使用某个类时必定知道它是什么类，是用来做什么的。于是我们直接对这个类进行实例化，之后使用这个类对象进行操作。这样子进行类对象的初始化，我们可以理解为“正”。</p>
<p>与之相反，反射 (Reflection) 是 Java 的特征之一，其核心是 JVM 在运行时才动态加载类或调用方法/访问属性，它不需要事先（写代码的时候或编译期）知道运行对象是谁。</p>
<p>Java 反射主要提供以下功能：</p>
<ul>
<li>在运行时判断任意一个对象所属的类</li>
<li>在运行时构造任意一个类的对象</li>
<li>在运行时判断任意一个类所具有的成员变量和方法（通过反射甚至可以调用private方法）</li>
<li>在运行时调用任意一个对象的方法</li>
</ul>
<p>具体可以参见这张运行图：</p>
<p></p><figure><img src="/blog-assets/images/Java/reflection.png" alt="reflection.png" /><figcaption>reflection.png</figcaption></figure><p></p>
</li>
<li>
<p><strong>Java反射机制有什么用途？</strong></p>
<p>反射最重要的用途就是开发各种通用框架。很多框架（比如 Spring）都是配置化的（比如通过 XML 文件配置 Bean），为了保证框架的通用性，它们可能需要根据配置文件加载不同的对象或类，调用不同的方法，这个时候就必须用到反射，运行时动态加载需要加载的对象。</p>
</li>
</ol></section>
<section><h1>多线程锁<a href="#多线程锁"><span>#</span></a></h1><section><h2>ReentrantLock<a href="#reentrantlock"><span>#</span></a></h2><p>Java语言直接提供了synchronized关键字用于加锁，但这种锁一是很重，二是获取时必须一直等待，没有额外的尝试机制。java.util.concurrent.locks包提供的ReentrantLock用于替代synchronized加锁。</p><p>ReentrantLock相比synchronized有几个特点：</p><ul>
<li>必须在代码中去获取锁，用完之后必须释放</li>
<li>比起synchronized更安全，因为可以搭配try…finally代码块，允许用trylock尝试获取锁，即便失败了也不会让程序退出运行或者导致死锁，允许额外的容错处理机会</li>
</ul><p>ReentrantLock 内部有一个抽象类 Sync，继承了 AbstractQueuedSynchronizer。而公平锁的实现就是 FairSync，非公平锁的实现就是 NonFairSync。具体生成锁时，只需要在构造方法中使用一个 boolean 参数即可。默认是非公平锁。</p><section><h3>底层实现<a href="#底层实现-2"><span>#</span></a></h3><p><strong>AbstractQueuedSynchronizer</strong></p><p>AbstractQueuedSynchronizer （抽象队列同步器，以下简称 AQS）出现在 JDK 1.5 中，是很多同步器的基础框架，比如 ReentrantLock、CountDownLatch 和 Semaphore 等都是基于 AQS 实现的。我们也可以基于 AQS定制出所需要的同步器。</p><p>在 AQS 内部，通过维护一个FIFO 队列来管理多线程的排队工作。在公平竞争的情况下，无法获取同步状态的线程将会被封装成一个节点，置于队列尾部。</p><p>AQS有两种模式：共享和独享。</p><p>独享模式下获取同步状态的流程：</p><ol>
<li>调用 tryAcquire 方法尝试获取同步状态</li>
<li>获取成功，直接返回；获取失败，将线程封装到节点中，并将节点入队</li>
<li>入队节点在 acquireQueued 方法中自旋获取同步状态</li>
<li>若节点的前驱节点是头节点，则再次调用 tryAcquire 尝试获取同步状态</li>
<li>获取成功，当前节点将自己设为头节点并返回</li>
<li>获取失败，可能再次尝试，也可能会被阻塞。这里简单认为会被阻塞。</li>
</ol><p>独享模式下释放同步状态的流程：</p><ol>
<li>调用 tryRelease(arg) 尝试释放同步状态</li>
<li>根据条件判断是否应该唤醒后继线程</li>
</ol><p>共享模式下获取同步状态的流程：</p><ol>
<li>获取共享同步状态</li>
<li>若获取失败，将线程封装到节点中，并将节点入队</li>
<li>如果前驱为头结点，再次尝试获取共享同步状态</li>
<li>获取成功则将自己设为头结点，如果后继节点是共享类型的，则唤醒</li>
<li>若失败，将节点状态设为 SIGNAL，再次尝试。若再次失败，线程进入等待状态</li>
</ol><p>共享模式下释放同步状态的流程：</p><ol>
<li>调用doReleaseShared</li>
<li>如果 head 节点等待状态为 SIGNAL，则将 head 节点状态设为 0，并唤醒后继节点；如果 head 节点等待状态为 0，则将 head 节点状态设为 PROPAGATE，保证唤醒能够正常传播下去</li>
</ol><p>总结：独占模式下，只有一个节点线程可以成功获取同步状态，也只有获取已同步状态节点线程才可以释放同步状态。但在共享模式下，多个共享节点线程可以同时获得同步状态，在一些线程获取同步状态的同时，可能还会有另外一些线程正在释放同步状态。</p><p><strong>公平锁</strong></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>static</span><span> </span><span>final</span><span> </span><span>class</span><span><span> </span><span>FairSync</span><span> </span></span><span>extends</span><span><span> </span><span>Sync</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>// 以公平的方式锁</span></div></div><div><div><div>3</div></div><div><span>    </span><span>final</span><span> </span><span>void</span><span> </span><span>lock</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>// 调用AQS框架的逻辑</span></div></div><div><div><div>5</div></div><div><span>        </span><span>acquire</span><span>(</span><span>1</span><span>);</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>    </span><span>// AQS acquire 方法会调用tryAcquire这个方法</span></div></div><div><div><div>8</div></div><div><span>    </span><span>protected</span><span> </span><span>final</span><span> </span><span>boolean</span><span> </span><span>tryAcquire</span><span>(</span><span>int</span><span><span> </span><span>acquires</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span>        </span><span>final</span><span> </span><span>Thread</span><span><span> </span><span>current</span><span> </span></span><span><span>=</span><span> </span></span><span>Thread</span><span>.</span><span>currentThread</span><span>();</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>getState</span><span>();</span></div></div><div><div><div>11</div></div><div><span>        </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>hasQueuedPredecessors</span><span><span>() </span><span>&amp;&amp;</span><span>  </span></span><span>compareAndSetState</span><span>(</span><span>0</span><span>, acquires)) {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>// 成功获得锁，设置锁的所有者为当前线程</span></div></div><div><div><div>14</div></div><div><span>                </span><span>setExclusiveOwnerThread</span><span>(current);</span></div></div><div><div><div>15</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>        </span><span>else</span><span> </span><span>if</span><span><span> (current </span><span>==</span><span> </span></span><span>getExclusiveOwnerThread</span><span>()) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>// 可重入锁的逻辑</span></div></div><div><div><div>20</div></div><div><span>            </span><span>int</span><span><span> </span><span>nextc</span><span> </span></span><span><span>=</span><span> c </span><span>+</span><span> acquires;</span></span></div></div><div><div><div>21</div></div><div><span>            </span><span>if</span><span><span> (nextc </span><span>&lt;</span><span> </span></span><span>0</span><span>)</span></div></div><div><div><div>22</div></div><div><span>                </span><span>throw</span><span> </span><span>new</span><span> </span><span>Error</span><span>(</span><span>"Maximum lock count exceeded"</span><span>);</span></div></div><div><div><div>23</div></div><div><span>            </span><span>setState</span><span>(nextc);</span></div></div><div><div><div>24</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>公平锁调用的是 AQS 的acquire方法，而AQS 会回调子类的tryAcquire方法。具体逻辑是：</p><ol>
<li>获取 state 变量，如果是 0，说明当前锁没有线程占用, 可以获取</li>
<li>如果当前线程不是锁的占有者，判断 AQS 队列中是否有等待的线程，如果没有，就使用 CAS 尝试获取。如果CAS能修改state = 1，说明锁获取成功，将锁的持有线程修改为当前线程。所谓公平，就体现这一步的“判断 AQS 队列中是否有等待的线程中，对应的函数是hasQueuedPredecessors，避免了新来的线程插队的情况</li>
<li>如果当前线程已经是锁的占有者，允许重入获取锁，同样也是修改state值，不过需要检查是否超出了最大持有锁上限</li>
<li>任何情况下获取锁失败，返回false，AQS会将这个线程放进队列并挂起。</li>
</ol><p><strong>非公平锁</strong></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>static</span><span> </span><span>final</span><span> </span><span>class</span><span><span> </span><span>NonfairSync</span><span> </span></span><span>extends</span><span><span> </span><span>Sync</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>static</span><span> </span><span>final</span><span> </span><span>long</span><span> serialVersionUID </span><span><span>=</span><span> </span></span><span>7316153563782823691L</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>final</span><span> </span><span>void</span><span> </span><span>lock</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>// 非公平获得锁，进来直接使用CAS修改，修改成功就是获得锁</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span> (</span><span>compareAndSetState</span><span>(</span><span>0</span><span>, </span><span>1</span><span>))</span></div></div><div><div><div>7</div></div><div><span>            </span><span>setExclusiveOwnerThread</span><span>(</span><span>Thread</span><span>.</span><span>currentThread</span><span>());</span></div></div><div><div><div>8</div></div><div><span>        </span><span>else</span></div></div><div><div><div>9</div></div><div><span>            </span><span>// acquire 是AQS里面的方法，最终会调用到非公平锁的实现方法tryAcquire</span></div></div><div><div><div>10</div></div><div><span>            </span><span>acquire</span><span>(</span><span>1</span><span>);</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>    </span><span>protected</span><span> </span><span>final</span><span> </span><span>boolean</span><span> </span><span>tryAcquire</span><span>(</span><span>int</span><span><span> </span><span>acquires</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>// 非公平获得锁</span></div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> </span><span>nonfairTryAcquire</span><span>(acquires);</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>abstract</span><span> </span><span>static</span><span> </span><span>class</span><span><span> </span><span>Sync</span><span> </span></span><span>extends</span><span><span> </span><span>AbstractQueuedSynchronizer</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>...</span></div></div><div><div><div>3</div></div><div><span>    </span><span>final</span><span> </span><span>boolean</span><span> </span><span>nonfairTryAcquire</span><span>(</span><span>int</span><span><span> </span><span>acquires</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>4</div></div><div><span>      </span><span>// 当前线程</span></div></div><div><div><div>5</div></div><div><span>      </span><span>final</span><span> </span><span>Thread</span><span><span> </span><span>current</span><span> </span></span><span><span>=</span><span> </span></span><span>Thread</span><span>.</span><span>currentThread</span><span>();</span></div></div><div><div><div>6</div></div><div><span>      </span><span>// state 状态</span></div></div><div><div><div>7</div></div><div><span>      </span><span>int</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>getState</span><span>();</span></div></div><div><div><div>8</div></div><div><span>      </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>          </span><span>// CAS 修改state 值</span></div></div><div><div><div>10</div></div><div><span>          </span><span>if</span><span> (</span><span>compareAndSetState</span><span>(</span><span>0</span><span>, acquires)) {</span></div></div><div><div><div>11</div></div><div><span>              </span><span>// 成功获得锁，修改锁的所有者线程</span></div></div><div><div><div>12</div></div><div><span>              </span><span>setExclusiveOwnerThread</span><span>(current);</span></div></div><div><div><div>13</div></div><div><span>              </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>          </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>      </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (current </span><span>==</span><span> </span></span><span>getExclusiveOwnerThread</span><span>()) {</span></div></div><div><div><div>16</div></div><div><span>          </span><span>// 检查锁的所有者是否是当前线程</span></div></div><div><div><div>17</div></div><div><span>          </span><span>// 当前线程获得锁，可重入逻辑</span></div></div><div><div><div>18</div></div><div><span>          </span><span>int</span><span><span> </span><span>nextc</span><span> </span></span><span><span>=</span><span> c </span><span>+</span><span> acquires;</span></span></div></div><div><div><div>19</div></div><div><span>          </span><span>if</span><span><span> (nextc </span><span>&lt;</span><span> </span></span><span>0</span><span>) </span><span>// overflow</span></div></div><div><div><div>20</div></div><div><span>              </span><span>throw</span><span> </span><span>new</span><span> </span><span>Error</span><span>(</span><span>"Maximum lock count exceeded"</span><span>);</span></div></div><div><div><div>21</div></div><div><span>          </span><span>setState</span><span>(nextc);</span></div></div><div><div><div>22</div></div><div><span>          </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>      </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>...</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>非公平锁与公平锁调用的acquire方法是一样的，不同的是tryAcquire部分。</p><p>非公平锁进来直接尝试CAS修改state值，如果CAS能修改state = 1，说明锁获取成功，将锁的持有线程修改为当前线程。而如果失败，就会调用AQS的acquire方法，而AQS 会回调子类的tryAcquire方法，里面进一步调用了nonfairTryAcquire这个方法。具体逻辑是：</p><ol>
<li>获取当前线程，当前 state 值</li>
<li>如果 state 值为0 ，直接使用CAS 修改，修改成功代表获得锁，如果成功获得锁，修改锁的所有者线程为当前线程</li>
<li>如果 state 值不为0，检查锁的所有者是否是当前线程，如果是，进入可重入逻辑，修改state，成功获得锁</li>
<li>没有获得锁，返回false</li>
</ol><p>因为非公平锁没有进行队列检查等步骤，相对更快速一些，所以ReentrantLock默认使用了非公平锁。</p></section></section><section><h2>ReentrantReadWriteLock<a href="#reentrantreadwritelock"><span>#</span></a></h2><p>ReentrantLock保证了只有一个线程可以执行临界区代码，但是有些时候，这种保护有点过头，因为其显著降低了并发效率。实际上我们想要的是：允许多个线程同时读，但只要有一个线程在写，其他线程就必须等待。</p><p>ReadWriteLock解决了上述问题，它有以下特点：</p><ul>
<li>提高读取效率</li>
<li>只允许一个线程写入</li>
<li>允许多个线程在没有写入时同时读取；</li>
<li>适合读多写少的场景</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Counter</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>final</span><span> </span><span>ReadWriteLock</span><span> rwlock </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ReentrantReadWriteLock</span><span><span>()</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>final</span><span> </span><span>Lock</span><span> rlock </span><span><span>=</span><span> </span></span><span>rwlock</span><span>.</span><span>readLock</span><span>();</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>final</span><span> </span><span>Lock</span><span> wlock </span><span><span>=</span><span> </span></span><span>rwlock</span><span>.</span><span>writeLock</span><span>();</span></div></div><div><div><div>5</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] counts </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>10</span><span><span>]</span><span>;</span></span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>inc</span><span>(</span><span>int</span><span><span> </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>wlock</span><span>.</span><span>lock</span><span>(); </span><span>// 加写锁</span></div></div><div><div><div>9</div></div><div><span>        </span><span>try</span><span> {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>counts[index] </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>} </span><span>finally</span><span> {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>wlock</span><span>.</span><span>unlock</span><span>(); </span><span>// 释放写锁</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>get</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>17</div></div><div><span>        </span><span>rlock</span><span>.</span><span>lock</span><span>(); </span><span>// 加读锁</span></div></div><div><div><div>18</div></div><div><span>        </span><span>try</span><span> {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>Arrays</span><span>.</span><span>copyOf</span><span>(counts, </span><span>counts</span><span>.</span><span>length</span><span>);</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>} </span><span>finally</span><span> {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>rlock</span><span>.</span><span>unlock</span><span>(); </span><span>// 释放读锁</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>StampedLock<a href="#stampedlock"><span>#</span></a></h2><p>StampedLock和ReadWriteLock相比，改进之处在于：读的过程中也允许获取写锁后写入。</p><p>和ReadWriteLock相比，写入的加锁是完全一样的，不同的是读取，先获取一个乐观读锁，并返回版本号。接着进行读取，读取完成后验证版本号，如果在读取过程中没有写入，版本号不变则验证成功；如果在读取过程中有写入，版本号会发生变化，验证将失败。此时，我们再通过获取悲观读锁再次读取。由于写入的概率不高，程序在绝大部分情况下可以通过乐观读锁获取数据，极少数情况下使用悲观读锁获取数据。</p><p>总的来说，StampedLock把读锁细分为乐观读和悲观读，能进一步提升并发效率。但这也是有代价的：一是代码更加复杂，二是StampedLock是不可重入锁，不能在一个线程中反复获取同一个StampedLock。此外，StampedLock还提供了更复杂的将悲观读锁升级为写锁的功能，它主要使用在if-then-update的场景：即先读，如果读的数据满足条件，就返回，如果读的数据不满足条件，再尝试写。</p></section></section>
<section><h1>线程池<a href="#线程池"><span>#</span></a></h1><section><h2>简介<a href="#简介"><span>#</span></a></h2><p>线程池（Thread Pool）是一种基于池化思想管理线程的工具，经常出现在多线程服务器中，主要作用是维护多个线程，等待监督管理者分配可并发执行的任务。</p><p>Java中可以直接使用new Thread生成一个新线程，然而这样生成的线程性能差，缺乏管理，功能少。使用线程池可以带来一系列好处：</p><ul>
<li>降低资源消耗：通过池化技术重复利用已创建的线程，降低线程创建和销毁造成的损耗</li>
<li>提高响应速度：任务到达时，无需等待线程创建即可立即执行</li>
<li>提高线程的可管理性：线程是稀缺资源，如果无限制创建，不仅会消耗系统资源，还会因为线程的不合理分布导致资源调度失衡，降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控</li>
<li>提供更多更强大的功能：线程池具备可拓展性，允许开发人员向其中增加更多的功能。比如延时定时线程池ScheduledThreadPoolExecutor，就允许任务延期执行或定期执行</li>
</ul></section><section><h2>参数<a href="#参数"><span>#</span></a></h2><p>Java使用ThreadPoolExecutor生成线程池，其构造函数有一些重要参数：</p><ul>
<li>corePoolSize：核心池的大小</li>
<li>maximumPoolSize：线程池最大线程数</li>
<li>poolSize： 线程池中当前线程的数量
<ul>
<li>如果poolSize &lt; corePoolSize，新增加一个线程处理新的任务</li>
<li>如果poolSize = corePoolSize，新任务会被放入阻塞队列等待</li>
<li>如果阻塞队列的容量达到上限，且这时poolSize &lt; maximumPoolSize，新增线程来处理任务</li>
<li>如果阻塞队列满了，且poolSize = maximumPoolSize，那么线程池已经达到极限，会根据饱和策略RejectedExecutionHandler拒绝新的任务</li>
</ul>
</li>
<li>keepAliveTime：线程没有任务执行时最多保持多久时间会终止</li>
<li>workQueue：一个阻塞队列，用来存储等待执行的任务。阻塞队列一般有以下几种选择：
<ul>
<li>ArrayBlockingQueue
<ul>
<li>有界队列</li>
<li>加锁保证安全</li>
<li>队列满就阻塞，超时或者队列不满则唤醒被阻塞的出队线程</li>
<li>入队阻塞调用建议使用offer方法，可以及时获取boolean返回值判断是否成功；使用put方法需要考虑阻塞情况，因为出队速度大于入队速度</li>
</ul>
</li>
<li>LinkedBlockingQueue
<ul>
<li>无长度上限，需要当心内存溢出</li>
</ul>
</li>
<li>SynchronousQueue
<ul>
<li>无缓冲等待队列，是一个不存储元素的阻塞队列，会直接将任务交给消费者，必须等队列中的添加元素被消费后才能继续添加新的元素。</li>
</ul>
</li>
<li>PriorityBlockingQueue</li>
<li>DelayedWorkQueue</li>
</ul>
</li>
<li>threadFactory：执行程序创建新线程时使用的工厂</li>
<li>handler：表示当拒绝处理任务时的策略
<ul>
<li>AbortPolicy：丢弃任务并抛出RejectedExecutionException异常</li>
<li>DiscardPolicy：丢弃任务，但是不抛出异常</li>
<li>DiscardOldestPolicy：丢弃队列最前面的任务，然后重新尝试执行任务，不断重复此过程</li>
<li>CallerRunsPolicy：由调用线程处理该任务</li>
</ul>
</li>
<li>runState：volatile关键词修饰的线程池运行状态
<ul>
<li>RUNNING：线程池接受新任务并执行队列任务中</li>
<li>SHUTDOWN：不再接受新任务，但是会继续执行等待队列Queued中的任务</li>
<li>STOP：不再接受新任务，同时也不执行等待队列Queued中的任务，并且会尝试终止正在执行中的任务</li>
<li>TERMINATED：线程池中所有线程已经停止运行</li>
</ul>
</li>
</ul></section><section><h2>种类<a href="#种类"><span>#</span></a></h2><p>Java通过Executors提供几种线程池，底层均是由ThreadPoolExecutor实现的，例如：</p><ul>
<li>newFixedThreadPool
<ul>
<li>定长线程池，可控制线程最大并发数，超出的线程会在队列中等待</li>
<li>使用完毕必须手动关闭线程池， 否则会一直在内存中存在</li>
</ul>
</li>
<li>newCachedThreadPool
<ul>
<li>可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程</li>
<li>使用SynchronousQueue</li>
</ul>
</li>
<li>newScheduledThreadPool
<ul>
<li>定长线程池，支持定时及周期性任务执行</li>
<li>使用DelayedWorkQueue</li>
</ul>
</li>
<li>newSingleThreadExecutor
<ul>
<li>单线程化的线程池，它只会用唯一的工作线程来执行任务，保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行</li>
</ul>
</li>
<li>newWorkStealingPool
<ul>
<li>每个线程池分配一个双端队列(本地队列)用于存放需要执行的任务，当自己的队列没有数据的时候从其它线程池队列中获得一个任务继续执行</li>
<li>涉及到并行编程肯定涉及到并发安全的问题，有可能在“偷取”任务过程中A提前抢占了这个任务，那么B的偷取就会失败。大多数实现会尽量避免发生这个问题</li>
<li>一般是自己的本地队列采取LIFO(后进先出)，偷取时采用FIFO(先进先出)，一个从头开始执行，一个从尾部开始执行，由于偷取的动作十分快速，会大量降低这种冲突，也是一种优化方式</li>
</ul>
</li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2022-02-05-mysql/</id>
      <title type="text">MySQL</title>
      <published>2022-02-05T00:00:00.000Z</published>
      <updated>2022-02-05T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2022-02-05-mysql/"/>
      <summary type="text">MySQL Notes</summary>
      <content type="html"><![CDATA[<p>MySQL Notes</p>

<section><h2>MySQL优化<a href="#mysql优化"><span>#</span></a></h2><section><h3>优化查询效率<a href="#优化查询效率"><span>#</span></a></h3><p><strong>SQL语句层面：</strong></p><ul>
<li>select和join的先后顺序，一般先select后join</li>
<li>使用Explain命令
<ul>
<li>作用：查看一个这些SQL语句的执行计划，查看该SQL语句有没有使用想要的索引，有没有做全表扫描</li>
<li>可能统计出的行数和实际不一样。因为MySQL中数据的单位都是页，MySQL又采用了采样统计的方法，采样统计的时候，InnoDB默认会选择N个数据页，统计这些页面上的不同值，得到一个平均值。数据是一直在变的，所以索引的统计信息也是会变的，只是一个估值。另外，优化器走错索引，还可能是因为考虑其他因素，比如回表等等</li>
<li>如果发现错误，可以使用analyze table tablename就可以重新统计索引信息；或者force index，强制走正确的索引</li>
</ul>
</li>
<li>使用pt-query-digest，也可以分析慢查询</li>
</ul><p><strong>索引层面：</strong></p><ul>
<li>
<p>覆盖索引</p>
<ul>
<li>回表问题：先通过普通索引定位到主键值，再通过聚集索引定位到行记录，性能较扫一遍索引树低很多</li>
<li>用于解决回表问题，在一棵索引树上就能获取SQL所需的所有列数据，无需回表</li>
</ul>
</li>
<li>
<p>联合索引</p>
<ul>
<li>覆盖索引的一种实现，在两个或更多个列上建立索引</li>
<li>优点
<ul>
<li>联合索引比起单列分别建索引，减少了索引的数量，降低了写开销和磁盘开销</li>
<li>效率高，多列索引能够一次性筛选出想要的数据，避免中间的回表、排序、分页等过程</li>
</ul>
</li>
<li>注意调整联合时的顺序，查询语句执行时会从优先从左开始组成索引进行数据匹配（最左前缀原则）</li>
<li>可以使用explain语句，查看type字段是index还是ref，判断索引是否达到快速效果
<ul>
<li>index：效率不高，MySQL从索引中的第一个数据查到最后一个，直到找到符合判断的某个索引</li>
<li>ref：平常理解的“用索引快速找到数据”，索引字段必须有序</li>
</ul>
</li>
<li>不可以无限建立，过多的联合索引还是占据很多空间</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/* 假如索引存在于(col1, col2, col3)，则索引生效于索引会生效于(col1), (col1, col2), 以及(col1, col2, col3) */</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>/* 索引生效，触发ref  */</span></div></div><div><div><div>4</div></div><div><span>SELECT</span><span> * </span><span>FROM</span><span> tbl_name </span><span>WHERE</span><span><span> col1</span><span>=</span><span>val1;</span></span></div></div><div><div><div>5</div></div><div><span>SELECT</span><span> * </span><span>FROM</span><span> tbl_name </span><span>WHERE</span><span><span> col1</span><span>=</span><span>val1 </span></span><span>AND</span><span><span> col2</span><span>=</span><span>val2;</span></span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>/* 索引不生效，(col2)和(col2, col3) 不是(col1, col2, col3)的最左前缀，触发index */</span></div></div><div><div><div>8</div></div><div><span>SELECT</span><span> * </span><span>FROM</span><span> tbl_name </span><span>WHERE</span><span><span> col2</span><span>=</span><span>val2;</span></span></div></div><div><div><div>9</div></div><div><span>SELECT</span><span> * </span><span>FROM</span><span> tbl_name </span><span>WHERE</span><span><span> col2</span><span>=</span><span>val2 </span></span><span>AND</span><span><span> col3</span><span>=</span><span>val3;</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>索引下推</p>
<ul>
<li>MySQL 5.6之后的官方优化</li>
<li>如果使用了联合索引，在索引遍历过程中，对索引中包含的字段先做判断，直接过滤掉不满足条件的记录，减少回表次数</li>
</ul>
</li>
<li>
<p>索引维护</p>
<ul>
<li>索引以数据页的形式存在磁盘上</li>
<li>页分裂：插入一条数据需要写数据页，如果数据页满了，且插入位置在中间，那么存储引擎要申请一个新的数据页，把部分数据移动过去。数据插在尾部没有这个问题</li>
<li>页合并：删除一条数据，当页的利用率很低之后，就会合并页</li>
<li>避免页空洞：页分裂过程会产生“页空洞”，因为两个页都不满（分裂后只用50%），但是占用了两页的磁盘空间，因此不能进行页分裂</li>
</ul>
</li>
<li>
<p>根据使用场景，分析普通索引和唯一索引选择的合理性</p>
<ul>
<li>唯一索引上的字段的数据只能是唯一的，而普通索引可以有重复数据</li>
<li>唯一索引不能使用change buffer（因为需要进行唯一性检查），普通索引可以使用</li>
</ul>
</li>
</ul><p><strong>表层面：</strong></p><ul>
<li>检查是否满足范式，减少冗余</li>
<li>选择合适的数据类型，比如说int比varchar处理起来更简单，少用NULL因为会增加索引开销</li>
</ul><p><strong>更高级的层面：</strong></p><ul>
<li>修改MySQL配置，例如查询缓存、索引缓冲区这种</li>
<li>硬件优化，分析CPU、硬盘、网络的性能瓶颈等</li>
</ul></section><section><h3>数据量大<a href="#数据量大"><span>#</span></a></h3><ol>
<li>优化SQL和索引</li>
<li>增加一层缓存，比如Redis或者Memcached</li>
<li>做主从同步
<ul>
<li>一个数据库服务器异步复制到其他服务器上，在复制数据时，一个服务器充当主服务器（master），其余的服务器充当从服务器（slave）。master主服务器发生变化时，变化会实时同步到slave服务器</li>
<li>优点：水平拓展数据库的负载能力；数据备份，提升了容错性；读写分离，比如master负责写，slave负责读，避免锁表带来不利影响，同时分担数据访问压力</li>
<li>主机器上，主从同步事件会被写到binlog文件中(statement: 操作数据库的SQL语句；row: 每条数据的变化；mixed: statement与row的混合)。slave连接master节点后，master节点会创建一个binlog dump线程，用于发送bin log</li>
<li>把slave的线程分成两个线程，一个做binlogs的同步(我们称为I/O线程)，接受主服务器binlog dump进程发来的更新之后，保存在本地的relay log中；另一个做还原现场的工作(我们称为SQL线程)，读取relay log的内容，解析成具体的操作来执行。如此，master端的binlogs能以最小的延时，同步到slave，而slave这边的现场还原工作就可以慢慢来</li>
<li>默认情况下主库在执行完客户端提交的事务后会将结果返给给客户端，之后立即开始继续处理其他客户提交操作，并不关心从库是否已经接收并处理（优化：半同步复制，主库线程等待至少一个从库反馈，再进行后续操作）</li>
<li>有时主库tps并发较高，产生的DDL数量超过slave一个sql线程所能承受的范围；或slave的一些大型query语句产生了锁等待。这时就会产生主从延迟
<ul>
<li>对于写了之后立马就要保证可以查到的场景，采用强制读主库的方式，这样就可以保证读到数据</li>
<li>适当降低slave库的数据安全等级，比如说把innodb_flushlog等参数设置为0，提高sql语句执行效率</li>
<li>使用多台slave来分摊读请求，再从这些slave中取一台专用的服务器，只作为备份用，不进行其他任何操作，就能相对最大限度地达到实时的要求</li>
<li>使用比主库更好的硬件作为slave</li>
</ul>
</li>
</ul>
</li>
<li>做垂直拆分，分析模块的耦合度，把一个大的系统拆分成多个小的系统，按照系统业务进行分类，把数据压力分布到不同的数据库上面，即分布式数据库</li>
<li>做水平拆分
<ul>
<li>某个字段为依据（例如uid），按照一定规则（例如取模），将一个库（表）上的数据拆分到多个库（表）上，以降低单库（表）大小</li>
<li>拆分后，每个库（表）结构一样，但数据不一样，没有交集</li>
</ul>
</li>
</ol></section></section>
<section><h2>锁<a href="#锁"><span>#</span></a></h2><section><h3>按加锁范围划分<a href="#按加锁范围划分"><span>#</span></a></h3><p>简单来说，MySQL中有三种加锁范围不同的锁：</p><ul>
<li>表级锁：开销小，加锁快；锁粒度大；发生锁冲突概率最高，并发度最低</li>
<li>页面锁，开销和加锁时间介于表锁和行锁之间；锁粒度中等</li>
<li>行级锁：开销大，加锁慢；锁粒度小；发生锁冲突概率最低，并发度最高</li>
</ul><p>如果要进一步详细划分：</p><ul>
<li>全局锁
<ul>
<li>对整个数据库实例加锁，使得整个库处于只读状态</li>
<li>典型的应用场景是做全库的逻辑备份，全局锁确保没有其他线程对当前数据库做更新，然后再对整个库做备份</li>
</ul>
</li>
<li>表锁
<ul>
<li>有读写两种模式，可以直接LOCK TABLE table1 locktype(read/write)来指定</li>
<li>读锁不互斥，写锁互斥</li>
</ul>
</li>
<li>行锁
<ul>
<li>多个事务操作同一行数据时，后来的事务处于阻塞等待状态，但此时他们可以操作其他行数据</li>
<li>一般行级锁都是基于索引的，如果一条SQL语句用不到索引是不会使用行级锁的，因为需要请求大量的锁资源，速度慢，内存消耗大；并且需要等待事务完整执行完毕后才能释放</li>
<li>行锁可能会引起死锁问题，比如两个不同事务分别持有了一把锁，然后试图加对方的另一把锁，产生死锁
<ul>
<li>通过 innodb_lock_wait_timeout 来设置超时时间，InnoDB 中默认值是 50s，即第一个被锁住的事务等待超过 50s 才会超时退出，其他事务才能得以执行</li>
<li>通过设置 innodb_deadlock_detect = on，发起死锁检测，发现死锁之后主动回滚死锁链条中的某一个事务，让其他事务得以继续执行</li>
</ul>
</li>
<li>热点行问题：若干事务短时间内都要集中更新同一行，每个新来的被堵住的线程，都要判断会不会由于自己的加入导致了死锁，消耗大量CPU
<ul>
<li>临时关闭若干线程</li>
<li>控制数据库并发度</li>
<li>分治，考虑通过将一行改成逻辑上的多行来减少锁冲突</li>
</ul>
</li>
</ul>
</li>
</ul></section><section><h3>按模式划分<a href="#按模式划分"><span>#</span></a></h3><p>MySQL中有两种不同模式的锁：</p><ul>
<li>乐观锁
用数据版本（Version）记录机制实现；当读取数据时，将version字段的值一同读出，数据每更新一次，对此version值加1。当我们提交更新的时候，判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对，如果数据库表当前版本号与第一次取出来的version值相等，则予以更新，否则认为是过期数据。
注意如果产生了冲突，上层应用可能会多次重试执行，这导致性能降低，因此乐观锁更适合写入较少的场景。</li>
<li>悲观锁
悲观锁就是在操作数据时，认为此操作会出现数据冲突，所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作，需要耗费较多的时间。有两种常见的实现方法：
<ul>
<li>共享锁：
共享锁又称读锁 (read lock)，多个事务对于同一数据可以共享一把锁。其他用户可以并发读取数据，但任何事务都不能对数据进行修改（获取数据上的排他锁），直到所有共享锁被释放。</li>
<li>排他锁：
排他锁又称写锁（write lock），若某个事物对某一行加上了排他锁，只能这个事务对其进行读写，在此事务结束之前，其他事务不能对其进行加任何锁，其他进程可以读取，不能进行写操作，需等待其释放</li>
</ul>
</li>
</ul></section><section><h3>其他类型的锁<a href="#其他类型的锁"><span>#</span></a></h3><ul>
<li>
<p>间隙锁：</p>
<p>当我们用范围条件而不是相等条件检索数据，并请求共享或排他锁时，InnoDB会给符合条件的已有数据记录的索引项加锁；对于键值在条件范围内但并不存在的记录，叫做“间隙（GAP)”，InnoDB也会对这个“间隙”加锁，这种锁机制就是所谓的间隙锁。这样做是为了防止幻读，以及利于后续数据恢复</p>
</li>
</ul></section></section>
<section><h2>事务<a href="#事务"><span>#</span></a></h2><section><h3>MySQL并发事务产生的问题<a href="#mysql并发事务产生的问题"><span>#</span></a></h3><ul>
<li>丢失更新
<ul>
<li>第一类：A事务撤销，把已经提交的B事务的更新数据覆盖了</li>
<li>第二类：A事务提交，把已经提交的B事务的更新数据覆盖了</li>
</ul>
</li>
<li>脏读
<ul>
<li>读到未提交更新的数据</li>
</ul>
</li>
<li>不可重复读
<ul>
<li>读到已经提交更新的数据，但一个事务范围内两个相同的查询返回了不同数据</li>
</ul>
</li>
<li>幻读
<ul>
<li>读到另一个事务提交新插入/删除的数据</li>
</ul>
</li>
</ul></section><section><h3>MySQL事务隔离级别<a href="#mysql事务隔离级别"><span>#</span></a></h3><p>以下四种隔离级别按从高到底排序，四种隔离级别的安全性与性能成反比，最安全的性能最差，最不安全的性能最好。</p><ul>
<li>
<p>SERIALIZABLE（串行化）
一个事务在执行过程中完全看不到其他事务对数据库所做的更新。当两个事务同时操作数据库中相同数据时，如果第一个事务已经在访问该数据，第二个事务只能停下来等待，必须等到第一个事务结束后才能恢复运行。
可以解决上述所有并发事务问题。</p>
</li>
<li>
<p>REPEATABLE READ（可重复读）(MySQL的默认事务隔离级别)
一个事务在执行过程中可以看到其他事务已经提交的新插入的记录，但是不能看到其他事务对已有记录的更新。
可以解决除幻读之外所有的并发事务问题。</p>
</li>
<li>
<p>READ COMMITTED（读已提交数据）
当数据库系统使用READ COMMITTED隔离级别时，一个事务在执行过程中可以看到其他事务已经提交的新插入的记录，而且还能看到其他事务已经提交的对已有记录的更新。
可以解决第一类丢失更新和脏读问题。</p>
</li>
<li>
<p>READ UNCOMMITTED（读未提交数据）
一个事务在执行过程中可以看到其他事务没有提交的新插入的记录，而且还能看到其他事务没有提交的对已有记录的更新。
可以解决第一类丢失更新问题。</p>
</li>
</ul></section><section><h3>MySQL中与事务操作相关的两种日志？<a href="#mysql中与事务操作相关的两种日志"><span>#</span></a></h3><ul>
<li>
<p>重做日志(redo log)</p>
<ul>
<li>确保事务的持久性，防止在发生故障的时间点，尚有脏页未写入磁盘，在重启mysql服务的时候，根据redo log进行重做</li>
<li>物理格式的日志，记录的是物理数据页面的修改的信息</li>
<li>事务开始之后就产生redo log，redo log的落盘并不是随着事务的提交才写入的，而是在事务的执行过程中，便开始写入redo log文件中；对应事务的脏页写入到磁盘之后，redo log的使命也就完成了，其占用的空间就可以被覆盖</li>
</ul>
</li>
<li>
<p>回滚日志(undo log)</p>
<ul>
<li>保存了事务发生之前的数据的一个版本，可以用于回滚，同时可以提供多版本并发控制下的读（MVCC）</li>
<li>逻辑格式的日志，在执行undo的时候，仅仅是将数据从逻辑上恢复至事务之前的状态，而不是从物理页面上操作实现</li>
<li>事务开始之前，将当前是的版本生成undo log；当事务提交之后，undo log并不能立马被删除，而是放入待清理的链表，由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息，决定是否可以清理undo log的日志空间</li>
<li>MySQL 5.6之前，undo文件是保持在共享表空间的，这个共享表空间是不会也不能自动收缩的，所以即便回滚了版本，文件也不会变小。之后的版本支持把undo表空间配制成了独立文件，修复了这一问题</li>
</ul>
</li>
</ul></section></section>
<section><h2>MVCC<a href="#mvcc"><span>#</span></a></h2><section><h3>简介<a href="#简介"><span>#</span></a></h3><p>MVCC（multiversion concurrency control），多版本并发控制，主要是通过在每一行记录中增加2个字段，实现一个版本链：</p><ul>
<li>DB_TRX_ID：6个字节，表示最近一次修改本记录的事务ID</li>
<li>DB_ROLL_PTR：7个字节，回滚指针，指向回滚段中的undo log record，用于找出这个记录的上个修改版本的数据</li>
</ul><p>MVCC与undo log中相关记录配合使用，加上可见性算法，使得各个事务可以在不加锁的情况下能够同时地读取到某行记录上的准确值，提高了并发效率。</p></section><section><h3>不同事务隔离级别下的工作<a href="#不同事务隔离级别下的工作"><span>#</span></a></h3><p>MVCC只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容，因为READ UNCOMMITTED总是读取最新的数据行，而不是符合当前事务版本的数据行，而SERIALIZABLE会对所有读取到的行都加锁。</p><p>对于另两个级别，二者的主要区别是ReadView生成策略不同。ReadView中有个列表来存储系统中当前活跃的读写事务，也就是begin了还未提交的事务，通过这个列表来判断记录的某个版本是否对当前事务可见。最主要的与可见性相关的属性如下：</p><ul>
<li>up_limit_id：当前已经提交的事务号 + 1，事务号 &lt; up_limit_id ，对于当前Read View都是可见的。理解起来就是创建Read View视图的时候，之前已经提交的事务对于该事务肯定是可见的。</li>
<li>low_limit_id：当前最大的事务号 + 1，事务号 &gt;= low_limit_id，对于当前Read View都是不可见的。理解起来就是在创建Read View视图之后创建的事务对于该事务肯定是不可见的。</li>
<li>trx_ids：为活跃事务id列表，即ReadView初始化时当前未提交的事务列表。所以当进行RR读的时候，trx_ids中的事务对于本事务是不可见的（除了自身事务，自身事务对于表的修改对于自己当然是可见的）。理解起来就是创建RV时，将当前活跃事务ID记录下来，后续即使他们提交对于本事务也是不可见的。</li>
</ul><p>对于REPEATABLE READ，只有第一次读的时候会生成ReadView，之后的读都是复用这个ReadView；对于READ COMMITTED，每次查询都会生成一个独立的ReadView。</p></section></section>
<section><h2>存储引擎(MySQL)<a href="#存储引擎mysql"><span>#</span></a></h2><section><h3>InnoDB<a href="#innodb"><span>#</span></a></h3><ul>
<li>MySQL 5.5之后的默认引擎</li>
<li>使用B+树作为索引结构，表数据文件本身就是索引，叶节点data域保存了完整的数据记录。索引的key是数据表的主键，因此InnoDB表数据文件本身就是主索引。</li>
<li>索引分为两层，一层是主键索引，按照主键构建一棵B+树，只要建立了主键就会自动加上索引，叶子节点上存放着整张表的行记录数据；另一层是普通索引，叶子结点没有存放行记录的全部数据，只包含了需要的主键值，以及一个标签告诉存储引擎在哪里可以找到这行数据。</li>
</ul></section><section><h3>MyISAM<a href="#myisam"><span>#</span></a></h3><ul>
<li>MySQL 5.5之前的默认引擎</li>
<li>使用B+树作为索引结构，叶节点的data域存放的是数据记录的地址。</li>
<li>索引也是两层结构，与InnoDB类似，但是普通索引存储的是行记录的头指针</li>
<li>基本只适合频繁查询（读）的表，因为MyISAM锁是表锁，只有读读之间是并发的，写写之间和读写之间都是串行的，所以写起来慢</li>
</ul></section><section><h3>两个引擎的主要区别和选择<a href="#两个引擎的主要区别和选择"><span>#</span></a></h3><ol>
<li>InnoDB是聚簇索引，数据文件是和索引绑在一起的，必须要有主键，通过主键索引效率很高，但是辅助索引需要两次查询，先查询到主键，然后再通过主键查询到数据。因此，主键不应该过大，否则其他索引也会很大。而MyISAM是非聚集索引，数据文件是分离的，索引保存的是数据文件的指针，主键索引和辅助索引是独立的</li>
<li>InnoDB支持外键，而MyISAM不支持</li>
<li>InnoDB锁粒度是行锁，而MyISAM是表锁</li>
<li>InnoDB实现了缓冲管理，不仅能缓冲索引也能缓冲数据，并且会自动创建散列索引以加快数据的获取</li>
<li>InnoDB支持事务，MyISAM不支持。对于InnoDB每一条SQL语言都默认封装成事务，自动提交，这样会影响速度，所以最好把多条SQL放在begin和commit之间，组成一个事务</li>
<li>InnoDB不保存表的具体行数，执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数</li>
<li>主机宕机后，InnoDB表恢复性更好，MyISAM表易损坏</li>
</ol></section><section><h3>其他引擎<a href="#其他引擎"><span>#</span></a></h3><p>MEMORY引擎，提供内存表，不支持事务和外键。显著提高访问数据的速度，可用于缓存会频繁访问的、可以重构的数据、计算结果、统计值、中间结果。</p></section></section>
<section><h2>其他问题<a href="#其他问题"><span>#</span></a></h2><section><h3>Change Buffer<a href="#change-buffer"><span>#</span></a></h3><p>当需要更新一个数据页时，如果数据页在内存中就直接更新，而如果这个数据页还没有在内存中的话，在不影响数据一致性的前提下，InnoDB会将这些更新操作缓存在change buffer中，这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候，将数据页读入内存，然后执行change buffer中与这个页有关的操作。将change buffer中的操作应用到原数据页，得到最新结果的过程称为merge。除了访问这个数据页会触发merge外，系统有后台线程会定期merge。在数据库正常关闭（shutdown）的过程中，也会执行merge操作。</p><p>change buffer适合写多读少的场景（账单、日志…），页面写完后马上被访问的概率很小，对机械硬盘而言性能提升尤其明显。相反，如果更新后来紧接着查询操作，可以考虑关掉 change buffer。</p></section><section><h3>自增ID用尽<a href="#自增id用尽"><span>#</span></a></h3><p>默认情况下，AUTO_INCREMENT ID的最大值是4294967295，如果想再尝试插入一条新数据，ID将不会继续增长，会导致主键冲突。因此如果数据很多时，自增ID应该尽量使用bigint unsigned，范围是 -2^63 到 2^63 - 1</p><p>如果创建表没有显示申明主键，InnoDB会自动创建一个不可见的、长度为6字节的row_id，且InnoDB 维护了一个全局的 dictsys.row_id，所有未定义主键的表都共享该row_id，每次插入一条数据，都把全局row_id当成主键id，然后全局row_id加1。虽然row_id在代码实现上使用的是bigint unsigned类型，但因为其实际长度只有6字节，因此row_id超过2^48时就会溢出，存在主键冲突可能。</p><p>另外，MySQL 保存了一个全局变量 thread_id_counter，每新建一个连接，就将 thread_id_counter 复制给这个新连接的线程变量。thread_id_counter 定义的大小是 4 个字节，因此达到 2^32 - 1 后，它就会重置为 0，然后继续增加。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2022-02-05-%E6%95%B0%E6%8D%AE%E5%BA%93%E7%90%86%E8%AE%BA/</id>
      <title type="text">数据库理论</title>
      <published>2022-02-05T00:00:00.000Z</published>
      <updated>2022-02-05T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2022-02-05-%E6%95%B0%E6%8D%AE%E5%BA%93%E7%90%86%E8%AE%BA/"/>
      <summary type="text">数据库理论知识。</summary>
      <content type="html"><![CDATA[<p>数据库理论知识。</p>

<section><h1>关系型数据库<a href="#关系型数据库"><span>#</span></a></h1><section><h2>范式<a href="#范式"><span>#</span></a></h2><p>设计关系型数据库时，用来参考的设计规范。数据库使用范式，能够使常规的增删改查功能不易出错，并且尽可能的消除了数据库冗余。</p><p>下列范式按照从上到下的顺序，严格性逐渐递增：</p><ul>
<li>第一范式1NF
<ul>
<li>数据库表中的每一列都是不能分割的基本数据项</li>
<li>同一列中不能有多个值</li>
</ul>
</li>
<li>第二范式2NF
<ul>
<li>首先满足1NF</li>
<li>每一个非主键完全依赖于主键 （“张三”同学的年龄和性别等字段，不能存储别人的年龄性别，必须是他自己的，因为张三的学号信息就决定了，这行记录归张三所有）</li>
</ul>
</li>
<li>第三范式3NF
<ul>
<li>首先满足2NF</li>
<li>消除了非主属性外对于键的传递依赖（对于学生表，主键为学号，主属性为学号，非主属性为姓名、系名和系主任。因为 学号 -&gt; 系名，同时 系名 -&gt; 系主任，所以存在非主属性系主任对于键学号的传递函数依赖，不符合）</li>
</ul>
</li>
<li>BCNF范式
<ul>
<li>首先满足3NF</li>
<li>不存在任何字段对键的传递依赖，相当于消除了主属性对键的传递依赖（学生,老师 -&gt; 课程，学生,课程 -&gt; 老师，而老师 -&gt; 课程，主键一部分被另一部分决定，所以不符合）</li>
</ul>
</li>
</ul></section><section><h2>连接<a href="#连接"><span>#</span></a></h2><p>数据库会（尽可能地）只产生满足where子句谓词的笛卡尔积元素来进行优化执行，这个过程就需要指定各种连接方式。
内连接：</p><ul>
<li>内连接(join或inner join)：关联过滤出的数据必须满足在左表和右表都符合条件。如果忘记写关联条件，就会出现笛卡尔积的情况</li>
</ul><p>外连接：</p><ul>
<li>左外连接(left outer join)：以左表为基本表，展示所有的左表中的数据，如果在右表中没有匹配的数据便为null</li>
<li>右外连接(right outer join)：以右表为基本表，展示所有的右表中的数据，如果在左表中没有匹配的数据便为null</li>
<li>全连接(full outer join)：全关联是只要其中某个表存在匹配的记录，便会返回行</li>
</ul><p>对于上述连接，常常搭配on子句，即在on子句中指定连接条件，在where子句中出现其它的连接条件，这样的SQL可读性更好。</p><p>另外，还有自然连接：</p><ul>
<li>自然连接只取出两张表的笛卡尔乘积中，那些在两个表中都出现的字段上取值相同的结果。两张表中都有的字段，只出现一次（即被合并成一列）。</li>
<li>常常搭配using子句来允许用户指定哪些字段相等</li>
</ul></section><section><h2>索引<a href="#索引"><span>#</span></a></h2><section><h3>索引简介与分类<a href="#索引简介与分类"><span>#</span></a></h3><p>索引是一种支持从数据表中高效获取数据的数据结构。</p><p>稠密/稀疏索引：</p><ul>
<li>稠密索引：每个索引键值都对应有一个索引项
<ul>
<li>更快的定位一条记录</li>
</ul>
</li>
<li>稀疏索引：稀疏索引只为某些搜索码值建立索引记录；在搜索时，找到其最大的搜索码值小于或等于所查找记录的搜索码值的索引项，然后从该记录开始向后顺序查询直到找到为止。
<ul>
<li>所占空间更小，且插入和删除时的维护开销也小。</li>
</ul>
</li>
</ul><p>聚集(聚簇)索引/非聚集(非聚簇)索引：</p><ul>
<li>聚集索引：常说的主键索引，叶子节点就是数据节点，保存当前行的所有数据；索引项的排序方式和表中数据记录排序方式一致
<ul>
<li>一个表只能有一个聚集索引，因为行记录只能按照一个维度进行排序</li>
<li>使用场合：1 查询命令的回传结果是以该字段为排序依据 2 查询的结果返回一个区间的值 3 查询的结果返回某值相同的大量结果集</li>
<li>降低了insert和update的性能</li>
</ul>
</li>
<li>非聚集索引：叶子节点仍然是索引节点，只不过有指向对应数据块的指针；索引顺序与物理存储顺序不同
<ul>
<li>使用场合：1 查询所获数据量较少 2 某字段中的数据的唯一性比较高</li>
<li>必须是稠密索引</li>
</ul>
</li>
</ul></section><section><h3>索引与主键的区别<a href="#索引与主键的区别"><span>#</span></a></h3><p>主要区别：</p><ul>
<li>主键用于标识关系型数据库中某行记录唯一性，不允许记录重复，且键值不能为空；索引没有这些限制，数据库里不一定有索引，索引列中的值也可能有重复</li>
<li>数据表中只允许有一个主键，但是可以有多个索引。</li>
<li>使用主键会数据库会自动创建主索引，因此主键本身也是一个特殊的唯一索引；但同时也可以在其他非主键上创建索引</li>
</ul><p>效率比较：
主键是唯一索引，聚簇索引（一般是哈希索引，…），因此通常会比较快，而索引实现有多种方式，可能是唯一索引可能是普通索引，性能不能一概而论，要结合具体的使用场景来看（change buffer…）</p></section></section><section><h2>B+树<a href="#b树"><span>#</span></a></h2><section><h3>特点<a href="#特点"><span>#</span></a></h3><ul>
<li>非叶子节点只进行数据索引，使得B+树非叶子节点容纳关键字的能力大大增加</li>
<li>所有叶子节点之间都有一个链指针，关键字从小到大有序排列</li>
<li>数据记录都存放在叶子节点中，每次数据查询的次数都一样，都是从父节点到叶节点</li>
</ul><p>这样设计的好处是极大增加了每个节点存储的key值数量，降低了B+树的高度。由于索引文件常常存储在磁盘上，索引查找会产生磁盘I/O消耗，由于B+树的高度很低，因此I/O开销很低。</p></section><section><h3>与二叉树/B树的对比<a href="#与二叉树b树的对比"><span>#</span></a></h3><p><strong>对比二叉树：</strong>
对普通的二叉搜索树来说，构建的过程很容易使得树的两支高度不平衡，进而使得搜索的性能退化；而如果使用AVL或者红黑树等二叉平衡树，维护的代价非常大，因为每次插入更新数据时都要经过多次的旋转操作维持平衡，浪费时间。</p><p><strong>对比B树：</strong></p><ol>
<li>B+树的层级更少：相较于B树B+每个非叶子节点存储的关键字数更多，树的层级更少所以查询数据更快；</li>
<li>B+树查询速度更稳定：B+所有关键字数据地址都存在叶子节点上，而B树有些是存在非叶子节点的，所以每次查找的次数都相同所以查询速度要比B树更稳定;</li>
<li>B+树天然具备排序功能：B+树所有的叶子节点数据构成了一个有序链表，在查询大小区间的数据时候更方便，数据紧密性很高，缓存的命中率也会比B树高。</li>
<li>B+树全节点遍历更快：B+树遍历整棵树只需要遍历所有的叶子节点即可，而不需要像B树一样需要对每一层进行遍历，这有利于数据库做全表扫描。</li>
</ol></section><section><h3>缺点<a href="#缺点"><span>#</span></a></h3><p>如果查询的时候，需要非常频繁地获取到某些离根节点很近的数据，使用B树可能比B+树更高效，因为非叶子节点本身存有关键字数据的结构，可以进一步节省遍历树的时间。</p></section></section><section><h2>哈希索引<a href="#哈希索引"><span>#</span></a></h2><p>Hash索引是将索引键通过Hash运算之后，将Hash运算结果的Hash值和所对应的行指针信息存放于一个Hash表中。</p><p>优点：搜索效率高，一次定位
缺点：</p><ul>
<li>比较进行Hash运算后的值，只能用于等值过滤，不能进行范围查找</li>
<li>数据不按照索引顺序存储，因此也不能用于排序</li>
<li>哈希值可能存在冲突</li>
</ul></section><section><h2>事务<a href="#事务"><span>#</span></a></h2><section><h3>简介<a href="#简介"><span>#</span></a></h3><p>若干个对数据库进行增删改查的SQL语句构成一个事务。事务主要用于处理操作量大，复杂度高的数据，用来维护数据库的完整性。</p><p>事务需要满足四个条件（ACID）：</p><ul>
<li>原子性：一个事务中的所有操作，要么全部完成，要么全部不完成。如果事务在执行过程中发生错误，会被回滚到事务开始前的状态</li>
<li>一致性：在事务开始之前和事务结束以后，数据库的完整性没有被破坏，写入的数据必须完全符合所有的预设规则</li>
<li>隔离性：数据库允许多个并发事务同时对其数据进行读写和修改的能力，隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离有4个不同级别，详见下文。</li>
<li>持久性：事务处理结束后，对数据的修改就是永久的，即便系统故障也不会丢失。</li>
</ul></section><section><h3>两阶段锁<a href="#两阶段锁"><span>#</span></a></h3><p>两阶段锁（two-phase locking，2PL）是数据库事务处理时的并发控制方法，用于保证可串行化。这种方法把数据库锁分为两个阶段：</p><ul>
<li>扩张阶段：事务根据需要不断地获取锁，没有锁被释放</li>
<li>收缩阶段：锁被事务陆续释放，没有新的加锁</li>
</ul><p>本质上来说，2PL通过锁的设置保证了在每一组冲突操作中，第一个获得锁的事务一定会排在后来的事务之前执行，从而实现了等价于串行执行。此外，2PL使得事务具有较高的并发度，因为解锁不必发生在事务结尾。</p><p>2PL的不足是没有解决死锁的问题，因为它在加锁阶段没有顺序要求。如果两个事务分别申请了A, B锁，接着又申请对方的锁，此时就进入死锁状态。</p></section></section></section>
<section><h1>非关系型数据库<a href="#非关系型数据库"><span>#</span></a></h1><section><h2>简介<a href="#简介-1"><span>#</span></a></h2><p>在数据量达到一定规模时，由于关系型数据库的系统逻辑非常复杂，会导致诸多问题：</p><ul>
<li>为了维护一致性，常常需要进行加锁等操作，导致其读写速度下滑非常严重</li>
<li>对数据表结构进行调整十分不方便，降低了可维护性</li>
<li>高并发时，磁盘I/O是一个很大的瓶颈</li>
</ul><p>非关系型数据库（NoSQL）是对不同于传统的关系数据库的数据库管理系统的统称，有着以下的特点：</p><ul>
<li>数据以键值对存储，且结构不固定，每一个元组可以有不一样的字段，每个元组可以根据需要增加一些自己的键值对。</li>
<li>不使用 SQL 作为查询语言，一般是基于每个NoSQL数据库具体的数据结构等等自己设计语法来查询</li>
</ul></section><section><h2>优缺点<a href="#优缺点"><span>#</span></a></h2><p>非关系型数据库的出现，多是源于关系型数据库的性能不足，所以优点基本是建立在关系型数据库的缺点上。</p><ul>
<li>读写性能：无需经过 SQL 层的解析，读写性能很高。主要例子有Redis，由于其逻辑简单，而且纯内存操作，使得其性能非常出色，单节点每秒可以处理超过10万次读写操作</li>
<li>简单的扩展：基于键值对，数据没有耦合性，容易扩展。典型例子是 Cassandra，由于其架构是类似于经典的 P2P，所以能通过轻松地添加新的节点来扩展这个集群</li>
<li>存储格式多：支持key-value形式、文档形式、图片形式，而关系型数据库则只支持基础类型</li>
<li>低廉的成本：这是大多数分布式数据库共有的特点，因为主要都是开源软件，没有昂贵的License成本</li>
</ul><p>当然，非关系型数据库也有一些缺点：</p><ul>
<li>不支持 SQL 这样的工业标准，会对用户产生一定的学习和应用迁移成本</li>
<li>支持的特性不够丰富：比如说很多NoSQL数据库都不支持事务</li>
</ul></section></section>
<section><h1>数据库缓存问题与解决<a href="#数据库缓存问题与解决"><span>#</span></a></h1><section><h2>缓存穿透<a href="#缓存穿透"><span>#</span></a></h2><p>问题：key对应的数据在后端数据库并不存在，比如用一个不存在的用户id获取用户信息，每次针对此key的请求从缓存获取不到，请求都会到数据库，从而导致数据库崩溃</p><p>解决：采用BloomFilter，类似于一个基于哈希的集合，用来判断某个元素key是否存在于某个集合中。提前把有数据的key都放到BloomFilter中，每次查询的时候都先去BloomFilter判断，如果没有就直接返回null</p></section><section><h2>缓存击穿<a href="#缓存击穿"><span>#</span></a></h2><p>问题：key对应的数据存在，但在Redis中过期，此时若有大量并发请求过来，这些请求发现缓存过期一般会从后端数据库加载数据放到缓存，这个并发请求可能会把数据库压垮</p><p>解决：在缓存失效的时候，不立即去数据库加载数据，而是就运用互斥锁机制，只有拿到锁的第一个线程去请求数据库，然后插入缓存；其他的线程都等待若干时间后重新尝试从缓存中获取数据</p></section><section><h2>缓存雪崩<a href="#缓存雪崩"><span>#</span></a></h2><p>问题：当缓存服务器重启或者大量缓存集中在某一个时间段失效，后端数据库访问量增大导致崩溃</p><p>解决：采用服务器集群，提高容错率；或者引入本地缓存，Redis崩了靠本地还能支撑一阵</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2022-02-01-%E7%81%AB%E7%84%B0%E7%BA%B9%E7%AB%A0%E9%A3%8E%E8%8A%B1%E9%9B%AA%E6%9C%88%E5%9B%9B%E7%BA%BF%E5%BF%83%E5%BE%97/</id>
      <title type="text">火焰纹章风花雪月四线心得</title>
      <published>2022-02-01T00:00:00.000Z</published>
      <updated>2022-02-01T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2022-02-01-%E7%81%AB%E7%84%B0%E7%BA%B9%E7%AB%A0%E9%A3%8E%E8%8A%B1%E9%9B%AA%E6%9C%88%E5%9B%9B%E7%BA%BF%E5%BF%83%E5%BE%97/"/>
      <summary type="text">翠风，红花，银雪，苍月</summary>
      <content type="html"><![CDATA[<p>翠风，红花，银雪，苍月</p>

<section><h1>背景<a href="#背景"><span>#</span></a></h1><p>本人于2020年在switch上开始游玩《火焰纹章：风花雪月》(ファイアーエムブレム 風花雪月 / Fire Enblem: Three Houses)，这是我初次接触到火焰纹章系列这一经典的回合制策略战棋游戏IP。我对这款游戏极为痴迷，耗费200余小时将全部四条剧情线打通。此文可看作通关后个人对每条线剧情、优缺点的总结分析，也可看作是游玩后意犹未尽的消遣。</p><p>本作设定位于三雄鼎立的芙朵拉大陆上，三股势力分别是位于南部的阿德剌斯忒亚帝国，位于北部的法嘉斯神圣王国以及位于东部的雷斯塔诸侯同盟，彼此之间互相制衡。芙朵拉大多数居民都信奉赛罗司教，而大陆正中央区域正是加尔古·玛库大修道院，即赛罗司教中央教会的所在。多年以来教会高高在上，依靠传教以及修道院中武力强大的骑士团维持整块大陆的稳定。同时大修道院中还建有一座著名的士官学校，这所学校历史悠久，为芙朵拉大陆培养了诸多人才。故事开始之时，三个国家未来的领袖，以及来自三个国家的许多贵族、平民学生正要进入学校开始学习。游戏前半部分的学院篇也根据学生们的国籍分为了三个学级：黑鹫、青狮和金鹿。</p><p>从本作英文译名Three Houses来看，翻译者强调了“3”这个数字，既代表大陆上的三个国家，又代表了学校中的三个学级。但我认为这个翻译是不准确的，因为赛罗司教会同样是一股重要的势力，虽然其没有成为一个独立的国家，但它对于芙朵拉跨越千年的故事发展起到了决定性作用。从这个角度上看，游戏的日文原名“風花雪月”更加贴切，因为游戏后半部分的章节名字分别以翠风、红花、银雪、苍月进行命名，四个名字分别对应三国与教会中的某一股势力，玩家也将协助这股势力实现一统芙朵拉的伟业。当然制作组以“风花雪月”命名也有其他寓意，按照游戏监督草木原俊行在接受采访时所谈：</p><blockquote><p>…“风花雪月”出自中文成语，指的是风雅的、美丽的景色。我们经过很久才选定这个标题。副标题不只是强调“美丽”，还意味着季节感、时间流逝和生命的无常。我个人认为，“时间”对这款作品来说是很重要的要素。</p></blockquote></section>
<section><h1>翠风（金鹿线）<a href="#翠风金鹿线"><span>#</span></a></h1><p>翠风之章，对应雷斯塔诸侯同盟，同时对应游戏前半部分学院篇的金鹿学级。</p><p>金鹿线通关后令人感觉“天朗气清，惠风和畅”，如同春风拂面。这条线是四线中将游戏设定讲述得最为透彻的一条，玩家能彻底了解芙朵拉千年以来的恩怨情仇，同时也能顺藤摸瓜清理反派，不仅端掉了暗黑蠢动者的老巢，甚至还灭了千年前被封印的解放王与十杰大军。这样的结局不能说从此高枕无忧，但至少现有的历史遗留问题得到圆满解决。</p><p>同盟盟主库罗德是促成这一局面的重要功臣。库罗德被称为“战略桌上的神鬼军师”，从称谓上就能看出他是一个城府极深，波诡云谲的人物。他的智谋体现在多个方面，包括维护同盟稳定的高超手段、军事指挥上的神出鬼没、以及对芙朵拉历史敏锐精准的剖析。从游戏前半部分学院篇开始，他就对教会的历史、主角的能力展现出了浓厚的兴趣，一直暗中调查真相。金鹿线的后半部分也是他一直保持着这种强烈的探索欲，促成了真相大白的结局。然而，库罗德的出身背景以及他过人的智谋，也让他在与人交流时无法百分百信任对方。五年后库罗德和主角重逢时，他并不相信主角沉睡五年失忆的说辞，并对主角的能力产生了怀疑，借着清除盗贼的名义试探主角是否退步，今后还能否为他所用。尽管随着剧情的发展他逐步对主角敞开心扉吐露了自己的理想，也和主角开始称兄道弟（是否100%真心就见仁见智了），但结合整条线的剧情来看，他始终都必须依赖主角的身份（挂着炎之纹章的军旗）才能施展计划，比起另两位级长几乎无条件对主角的依赖，库罗德的似乎总是有所保留，心中也一直有自己的算盘。</p><p>整体而言，金鹿线的基调趋于理性，同盟军有能力独立思考自己为什么而战斗，所有的行动也基于自己的意志。这样的理性让他们谋定而后动，立场上也不囿于支持教会 vs. 反对教会的二元对立中。这个基调主要也源于库罗德的观念，他认为世界的进步源于各种各样的变革，固步自封只也会被思想的洪流冲垮，因此重要的不是站定某一方立场之后一成不变，而是从正反两面各自吸取优点，以此作为变革的前提。在金鹿线进攻帝国梅利赛乌斯要塞时，正是库罗德打破了芙朵拉和帕迈拉人之间的成见，借助了帕迈拉的军队的力量组成跨国联军，进而顺利攻下要塞。这里需要额外补充库罗德的背景：库罗德的母亲是同盟女子，当年远嫁岛芙朵拉大陆以外的敌国帕迈拉，生下了库罗德。混血身份让他无论身处哪个国度都得不到完全的认同，两个民族都因血统不纯而排挤他。长年累月的孤独感催生了他的梦想：他要打碎芙朵拉和外界的隔阂，让所有人不再介意民族、血液与身份而生活在一起。于是他的立场出现了两面性：一方面，他需要借助支持赛罗司教会的名头举起义旗，利于他获得更多支持；另一方面，他的终极理念与教会的教义背道而驰，毕竟芙朵拉的封闭性是由教会长期的思想灌输引起的，芙朵拉人民与异教徒老死不相往来。因此，库罗德并不介意教会在战争结束后是否倒台，即便教会仍然存在，他也会对其进行变革，逐步解放芙朵拉人民的思想。</p></section>
<section><h1>红花（黑鹫线）<a href="#红花黑鹫线"><span>#</span></a></h1><p>红花之章，对应阿德剌斯忒亚帝国，同时对应游戏前半部分学院篇的黑鹫学级。由于级长艾黛尔贾特是阿德剌斯忒亚帝国即将继任的皇女，因此此线又被称为皇女线。</p><p>黑鹫线是四条线中争议最大的一条线，艾黛尔贾特也可以说是游戏中争议最大的角色。根据草木原俊行披露的情报，制作组原先并未考虑制作皇女线，并且另外三条线中的立场或多或少也是偏向教会的：</p><ul>
<li>金鹿线中，同盟虽然终极目标与教会的教义冲突，但当下并无与教会发生正面冲突的必要，同盟有能力温和地实行思想改革，并且当下依然需要教会的名头获得支持。</li>
<li>教会线中，主角势力的立场本身就是维护教会，击败任何挑战教会权威的势力。</li>
<li>青狮线中，王国终极目标是建立一个天下大同的社会，消除人与人之间的隔阂。教会将成为王与民之间的一座桥梁，保护更多的老百姓过上好日子。</li>
</ul><p>然而开发后期，制作组内部有了开拓艾黛尔贾特“霸道”路线的想法，于是他们基于支持教会的立场反向逆推设计了红花之章。这导致黑鹫线与另外三条线是对立的。因此，对于游玩其他三线的大部分玩家而言，他们很容易产生“帝国、皇女是反派”这样的想法。</p><p>事实上，皇女和其他国家的领袖一样，试图建立全新的社会秩序，希望社会不会再有弱者受到压迫，只不过皇女将这种压迫归结于教会，毕竟教会用纹章控制着社会的运转。基于纹章的社会体制让皇女经历了诸多动乱，她本人连同兄弟姐妹也成为了纹章实验的牺牲品。皇女希望人民不要单纯信奉教会，即便是一个存在千年的正统势力也未必是始终合理的。另外，在黑鹫线中，因为有了与皇女深入相处的机会，玩家能够揭露皇女温柔细腻的一面。不管她对其他人的态度如何，她对主角一直十分仰慕与信赖，与主角肝胆相照。即便主角最后失去神力，她也依然陪伴在主角身边。多遭磨难的皇女早已养成了坚强的品性，但当她卸下自己的担子，像个普通女子一样向亲近之人寻求慰藉之时，场景还是十分温馨的。</p><p>然而皇女大多数时候性格强横，行事雷厉风行、杀伐决断，颇有一代女帝武则天的风范。对于阻拦她道路的人，无论曾经的交情如何，下场只有被击败。并且帝国军并不是那么“师出有名”，恐怕只有痴迷皇女人物设定，或者是热衷皇女与主角组CP的玩家能无条件接受她的“霸道”理念。整条线存在两个最大的争议点：</p><ul>
<li>化身炎帝，联合暗黑蠢动者共同颠覆芙朵拉大陆。尽管剧情多次提到皇女和暗黑蠢动者只是暂时互相利用的关系，深层价值观并不契合，并且主角到来之后帝国也逐渐和暗黑蠢动者划清界限，然而君子论迹不论心，皇女选择与邪恶为伍是不争的事实，并且她的选择也造成了诸多无法回头补救的悲剧（例如主角父亲因此丧命）。</li>
<li>理念激进，天马行空。皇女选择了最粗暴的战争方式建立全新的社会秩序，并以丑化教会的方式煽动帝国士兵发动战争。然而对信奉赛罗司教会的芙朵拉百姓而言，教会多年来并没有让他们遇到什么不幸，此时皇女却将个人意志强加于他们头上，必须接受没有教会这一现实。事实上，即便消除了教会，世界弱肉强食的法则仍然无法被改变，只要社会阶级制度存在，独立自主就极难实现，依然会有弱者如同当年的她一样被社会的不公给折磨。</li>
</ul><p>此外，前文已经提到黑鹫线是开发中后期临时决定制作的，因此这条线赶工痕迹明显，相比起其他线有若干明显缺陷：</p><ul>
<li>许多和教会、骑士团相关的人物会离开主角队伍。如果想要追求阵容热闹和深度的话，黑鹫线的可用人物会比其他线少一些。</li>
<li>流程过短。从章节数量来看，黑鹫线的18章要显著少于另外三条线的21或22章。这导致游戏人物成型时间短，相比起其他线少了至少三章的时间培养学生的能力，有的学生甚至来不及培养到最高级职业或最高级能力就已经通关了。</li>
<li>缺失了其他三线中的一些经典关卡，例如黎明追击战（金鹿、青狮、教会线）、古隆达兹三方会战（金鹿、青狮线）以及香巴拉之战（金鹿、教会线）。这几个关卡不仅难度有挑战性，更能提升游戏剧情的深度以及角色形象感染力。而黑鹫线总体游玩下来只是秦王扫六合般地攻城略地，所到之处战无不胜，统一大陆后戛然而止，铺垫已久的隐藏反派暗黑蠢动者限于篇幅没有交代清楚结局。</li>
<li>游戏中存在着学生挖角机制，原本和帝国敌对的学生们将跟随主角一同为帝国而战。没有挖角时，这些学生本应立于战场的另一侧，像真正的战士那样向主角发出灵魂拷问，即便死也是熠熠生辉地死去；但挖角后，每个角色犹如迷失自我一般，忘记了亲人、师长、朋友，只是机械地为了追随主角而碌碌地活着。从常理上分析，我也不认为主角和学生之间的仅仅一年的师生情能让这些有血有肉的角色做出背弃家国和亲朋好友的选择。</li>
</ul><p>总结，黑鹫线作为一条制作组创新加入的线路，出发点和立意值得肯定，但整体演绎效果不尽如人意。艾黛尔贾特本人的形象塑造毁誉参半，但勉强配得上生如“红花”之绚烂。作为一条对立于其他线立场的剧情线，黑鹫线在反向设计每个学生的立场时存在着诸多逻辑漏洞，好在皇女和主角之间确实能产生共鸣。个人而言，黑鹫线适合喜欢皇女人设的玩家无脑入坑；或者是在多周目时通关一次，作为对其他线游戏体验的补充。</p></section>
<section><h1>银雪（教会线）<a href="#银雪教会线"><span>#</span></a></h1><p>银雪之章，对应赛罗司教教会，学院篇时也对应黑鹫学级。</p><p>教会线是完全对立于黑鹫线存在的一条线。这两条线都必须在学院篇选择黑鹫学级。玩家如果选择帮助艾黛尔贾特登基并对抗教会，则进入黑鹫线；反之自动进入教会线，代价就是黑鹫学级之后缺少了级长皇女和跟班修伯特。这条线的立场也很纯粹：找到教会前任大司教蕾雅（青狮和金鹿线也要找，不过更像是实现其他目标时顺带完成）并复兴教会。主角将成为领袖组建一股势力，击败帝国并结束战争。</p><p>教会线在剧情编排上与金鹿线基本一致（重返修道院直到捣毁暗黑蠢动者老巢），但立场上不再局限与某个国家。主角引领的“新生军”自成一派，在帝国、王国、同盟三方之间周旋，从前期的夹缝中求生存逐步发展到后期的一统大陆。人物刻画上则偏重于原本教会中的人物，尤其是大司教蕾雅，这一条线中蕾雅会亲自出场解答关于主角身份、教会历史相关的诸多谜团；这也是唯一一条能和蕾雅达成S支援的剧情线。</p><p>教会线最大的特点是提供了一个更加独立的视角审视整块芙朵拉的局势变化。主角所在的新生军前期势单力薄，四处游走，还需要向同盟借兵渡过难关。但在主角的英明指挥下，新生军后来居上，证明了自己的实力并不弱于帝国、王国与同盟之间的任意一方。由于势力上的独立性，新生军缺席了古隆达兹的三方会战，虽然造成了游戏性的缺憾，但在剧情动画中通过士兵转述视角得知三方均伤亡惨重、悻悻而归的结局，某种程度上也有一种转述震撼感，让玩家意识到战争是多么残酷。教会原本的宗旨就是为人民带来幸福，这样的设定也能够增强玩家的使命感，更好代入教会的立场拯救芙朵拉。</p><p>此外，一些在其他线中上镜率没那么高的教会人物有了大放异彩的机会。尤其是西提司，在教会线中他成为了实际意义上的级长，发挥了中流砥柱的作用。而对于蕾雅的细腻刻画更能让人了解到这位神祖后裔千年来背负的孤独和使命。主角的诞生本质上是蕾雅触犯禁忌的后果，但玩家得知其身份后也能理解她的行为，更能体会到她一直以来对亲人倾注的情感。</p><p>不过，倘若玩家对教会的人物，尤其是蕾雅本人没有兴趣时，游玩教会线的意义就不大了。教会线与其他线的重复程度过高，学院篇几乎与黑鹫线的流程完全一致，仅一章有区别；战争篇则与金鹿线重复，玩家在金鹿线中同样能救出蕾雅并了解到事件的来龙去脉，更何况金鹿线还额外将当年反教会的余孽铲除得干干净净，这是教会线没有做到的。此外教会线的终章剧情我认为设计的比较失败：蕾雅因为受伤压制不住纹章之力，化身白兽姿态进攻修道院。虽然这个变身的理由是合理的，但这样的转变无疑让玩家短时间内难以接受，花费诸多气力刚救出来的人转眼间就要拔剑相向。。</p></section>
<section><h1>苍月（青狮线）<a href="#苍月青狮线"><span>#</span></a></h1><p>苍月之章，对应法嘉斯神圣王国，同时对应游戏前半部分学院篇的青狮学级。由于级长帝弥托利是法嘉斯神圣王国即将继任的王子，因此此线又被称为王子线。</p><p>贯穿青狮线的线索毫无疑问是达斯卡悲剧，青狮学级的人物因这场悲剧紧密地联系在一起。达斯卡悲剧的幕后黑手是暗黑蠢动者，他们希望挑起王国和帝国之间的全面战乱，进而颠覆芙朵拉，于是和王国内部的反王势力里应外合，在国王出行至达斯卡时突然发难。王国在悲剧中损失惨重，国王蓝贝尓本人以及包括古廉（菲力克斯的哥哥，英谷莉特的未婚夫）在内的骑士卫队成员被杀；另一名骑士古斯塔夫（雅妮特的父亲）救驾来迟，只救下了幸存的帝弥托利，古斯塔夫无法原谅自己护驾来迟，从此在修道院中隐姓埋名。而达斯卡被扣上了弑君的恶名，王国军向达斯卡人发起了惨无人道的清洗，少数像杜笃（被帝弥托利所救）这样幸存的达斯卡人在王国依然被人指指点点，地位堪忧。帝国皇女艾黛尔贾特本人并未直接参与达斯卡悲剧，但她是毋庸置疑的受益者（根据暗黑蠢动者领袖塔烈斯的原话，这是为了让炎帝获得力量）。可怜的帝弥托利在年少时曾与艾黛尔贾特两小无猜般地相处过一段时间，当时就对她颇有好感，临别之际赠予其短剑一柄；后来得知皇女与自己是名义上的姐弟时，更对她产生了亲人之情。然而这一切在炎帝身份的揭露后被彻底打碎，亲朋好友的惨状、父亲临终嘱托复仇的亡语如芒在背，王子不堪重负彻底黑化，将所有的仇恨转移到了炎帝身上。整个苍月之章的剧情由此变成了王子复仇记。</p><p>如果说金鹿线是四条线中最能凸显理性的一条，那么青狮线则是感性的巅峰。帝弥托利可以说是整个火焰纹章风花雪月刻画得最为生动、立体的角色，他每一次性情的转变都极大地影响着故事发展。王子并没有太深的城府，更没有其余两位级长的计谋，但他是一个善良热忱的青年，一直彬彬有礼以德服人，这使得他的人格魅力丝毫不逊于另两位级长。然而隐藏在温和外表下的是一颗渴望复仇的暴戾之心，毕竟对王子而言达斯卡悲剧始终如鲠在喉，只是他竭尽全力压制住了这种欲望。遗憾的是，炎帝身份的揭露让王子最终崩坏，沦落为一个杀手四海为家，用残忍的屠杀逃避死者在他脑海中一遍遍的诘难。即便与主角和昔日同窗重逢，他也不再信赖曾经的伙伴们。他对周围的人们恶语相加，也不再参与学院里的活动，就连上阵杀敌的语音也如同幽灵一般冷血。</p><p>幸运的是，青狮线里其他的伙伴们展现出了极大的坚毅与包容。他们的每个人身上都背负着一个悲剧，但没有一个人一蹶不振。所有人都在积极地生活，同时也在尽可能地帮助他人渡过难关，这也是许多玩家感叹青狮的伙伴们“犹如天使一般”的原因。即便重逢后王子展现出了颓丧的精神状态，他身边的伙伴们都在用自己的方式帮助他走出困境。众人的开导、战局的扭转、杜笃的回归、以及罗德里古付出的生命的代价，最终让王子恢复了理智。这个过程是漫长且艰难的，因此剧情上也不遗余力地铺垫了数节，让玩家能有充分的时间代入到剧情中。而再一次经历巨变，或者说是回归本心的王子，体现出的气度同样令人动容。只要皇女的理想符合他心中的道德准则，他愿意抛开仇恨，探究与皇女共存的可能。这一刻，那个胸怀天下，不遗余力建设大同社会的贤君又回来了。</p><p>不过，青狮线耗费过多笔墨刻画帝弥托利复仇，导致其在剧情真相揭露上并不清晰。贯穿全线的达斯卡悲剧直到通关之际，尚有许多疑问未能解开，玩家甚至需要通过王子和哈琵的支援对话补充更多的细节。而关于暗黑蠢动者的描述更是稀少，整个苍月之章中主角一行都不知道自己在战斗中击败的“神秘士兵”“神秘魔道士”们究竟是什么来历；如果不玩其他线，根本不知道死去的亚兰德尔公实际上就是塔烈斯；如果没有尤里斯与康斯坦洁的外传，终章中暗黑蠢动者的另一位领袖谬森也将极为突兀地登场，并且被稀里糊涂剿灭。只能说上天暗中眷顾了王国这些为了心中理想而奋斗的人们，因为实际上暗黑蠢动者的诸位重要人物已经在青狮线中被清理干净，达斯卡悲剧的主谋们得到了应有的惩罚。</p><p>学级人物上，青狮线在全挖角的情况下可以拥有四线最多的可操控角色，可以说是最热闹的一条线。级长帝弥托利很可能是整个游戏中属性成长最为变态的一个角色，无论是走地打拳、马上骑兵甚至飞龙上天都有很高的强度。此外，青狮线的许多角色之间原本就有颇深的交情，因此支援剧情观看起来沉浸感更强。如果想要体验厚重的剧情风味与深刻的人物形象塑造，青狮线是最佳的选择。</p></section>
<section><h1>总结<a href="#总结"><span>#</span></a></h1><p>火焰纹章风花雪月是一款优秀的游戏，四条剧情线各有千秋，在此不分高低优劣。在我看来，玩家一周目接触的剧情线尤为重要，因为人往往会犯先入为主的毛病，一周目会影响玩家后续多周目时对新一条线的评价。此外，同一个人物在不同剧情线中的表现可能大相径庭，因此也建议各位玩家游玩每一条线路时格局放开，尽可能站在每个角色在每条线中所处的立场上思考，用心感受制作组希望传达的思想。过于信奉某一条线的立场而对其他线充满偏见，便是一叶障目的不智之举了。</p><p>后记：近日火焰纹章风花雪月衍生作Fire Enblem Warriors: Three Hopes发售，以三学级为引开拓出三条新故事线，虽丰富了诸多火焰纹章风花雪月中的人设与故事，然而原汁未必原味，该作剧情高开低走，且三条线均是结尾戛然而止，令玩家不知所云，倍感突兀。此诚编剧狗尾续貂之作，不值一提。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2022-01-16-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/</id>
      <title type="text">操作系统</title>
      <published>2022-01-16T00:00:00.000Z</published>
      <updated>2022-01-16T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2022-01-16-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
      <summary type="text">操作系统知识点。</summary>
      <content type="html"><![CDATA[<p>操作系统知识点。</p>

<section><h2>进程，线程，协程<a href="#进程线程协程"><span>#</span></a></h2><section><h3>简介<a href="#简介"><span>#</span></a></h3><p>进程：</p><ul>
<li>进程是正在执行的程序</li>
<li>系统资源分配的最小单位，每个进程得到一定的资源，比如CPU时间、内存、I/O设备等等来完成任务</li>
<li>进程对应的内存空间中，分为以下数据区：
<ul>
<li>BSS(Block Starting Symbol)，存放程序中未初始化的全局变量，属于静态内存分配</li>
<li>数据段，存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。</li>
<li>代码段，存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定，通常属于只读区域；同时也可能也有可能包含一些只读的常数变量，例如字符串常量等</li>
<li>堆，存放进程运行中被动态分配的内存段，它的大小并不固定，可动态扩张或缩减 (malloc, free等函数分配/释放内存的位置)</li>
<li>栈，用户存放程序临时创建的局部变量。在函数被调用时，其参数也会被压入发起调用的进程栈中，并且待到调用结束后，函数的返回值也会被存放回栈中。</li>
</ul>
</li>
</ul><p>线程：</p><ul>
<li>线程属于进程，一个进程内可能有一至多个线程。</li>
<li>线程是CPU调度的最小单位，每个线程由独自享有线程ID、程序计数器、寄存器、栈等</li>
<li>每个线程与属于同一进程的其他线程共享进程地址空间、代码段、数据段、堆等资源</li>
</ul><p>协程：</p><ul>
<li>协程属于线程，协程的程序在线程内部运行，但是有自己的寄存器和栈</li>
<li>协程的调度切换完全在用户空间进行，只涉及基本的CPU上下文切换，没有内核切换的开销，非常快</li>
<li>因为只有一个线程，不存在同时写变量冲突，因此不需要多线程的锁机制，执行效率更高</li>
</ul></section><section><h3>多进程/多线程编程的优点与取舍<a href="#多进程多线程编程的优点与取舍"><span>#</span></a></h3><p>为并发而设计，能够响应并提供更多服务。</p><p>具体的选择，需要看具体的需求和资源限制</p><ul>
<li>数据共享与同步：多进程在共享上复杂，但在同步上容易；多线程则相反。</li>
<li>内存与CPU：多线程编程，因为它的内存成本较低，而且多线程的上下文切换也比较容易。</li>
<li>可靠性：多进程编程，因为进程之间不容易相互影响</li>
</ul></section><section><h3>多线程比单线程慢的例子<a href="#多线程比单线程慢的例子"><span>#</span></a></h3><p>在一个单核单处理器上：</p><ul>
<li>使用1个线程，循环打印100万个字符</li>
<li>使用100个线程，循环打印100万个字符</li>
</ul><p>这种情况下，使用100个线程会更慢，因为输出字符使用临界区资源，第二种情况在线程抢占资源上会浪费很多时间；而单核线程不用抢占。</p></section><section><h3>进程和线程的生命周期<a href="#进程和线程的生命周期"><span>#</span></a></h3><p>进程的生命周期：</p><ul>
<li>新建：进程被创建</li>
<li>执行：进程被执行</li>
<li>等待：进程等待某个事件发生，例如I/O完成或其他信号</li>
<li>就绪：进程等待分配CPU</li>
<li>终止：进程完成执行</li>
</ul><p></p><figure><img src="/blog-assets/images/OS/process-cycle.png" alt="process-cycle.png" /><figcaption>process-cycle.png</figcaption></figure><p></p><p>线程的生命周期：</p><ul>
<li>新建状态（New）：当线程对象对创建后，即进入了新建状态</li>
<li>就绪状态（Runnable）：当调用线程对象的<code>start()</code>方法，线程即进入就绪状态。处于就绪状态的线程，只是说明此线程已经做好了准备，随时等待CPU调度执行，</li>
<li>运行状态（Running）：当CPU开始调度处于就绪状态的线程时，此时线程才得以真正执行，即进入到运行状态。注：就绪状态是进入到运行状态的唯一入口，也就是说，线程要想进入运行状态执行，必须处于就绪状态中</li>
<li>阻塞状态（Blocked）：处于运行状态中的线程由于某种原因，暂时放弃对CPU的使用权，停止执行，此时进入阻塞状态，直到其进入到就绪状态，才有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同，阻塞状态又可以分为三种：
<ol>
<li>待阻塞：运行状态中的线程执行<code>wait()</code>方法，使本线程进入到等待阻塞状态</li>
<li>同步阻塞 — 线程在获取synchronized同步锁失败(因为锁被其它线程所占用)，它会进入同步阻塞状态</li>
<li>其他阻塞 — 通过调用线程的<code>sleep()</code>或<code>join()</code>或发出了I/O请求时，线程会进入到阻塞状态。当<code>sleep()</code>状态超时、<code>join()</code>等待线程终止或者超时、或者I/O处理完毕时，线程重新转入就绪状态</li>
</ol>
</li>
<li>死亡状态（Dead）：线程执行完了或者因异常退出了<code>run()</code>方法，该线程结束生命周期。需要保证在一定的情况下，线程的<code>run()</code>方法能够正常执行完毕；或者，使用标志位 / 抛出中断来退出线程。</li>
</ul><p></p><figure><img src="/blog-assets/images/OS/thread-cycle.png" alt="thread-cycle.png" /><figcaption>thread-cycle.png</figcaption></figure><p></p><p>补充：触发中断退出线程
阻塞状态时，如果有<code>interrupt()</code>发生，系统除了会抛出<code>InterruptedException</code>异常外，还会调用<code>interrupted()</code>函数，调用时能获取到中断状态是true的状态，调用完之后会复位中断状态为false，所以异常抛出之后通过<code>isInterrupted()</code>获取不到中断状态是true的状态，从而不能退出循环，因此在线程未进入阻塞的代码段时是可以通过<code>isInterrupted()</code>来判断中断是否发生来控制循环，在进入阻塞状态后要通过捕获异常来退出循环。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>ThreadSafe</span><span> </span></span><span>extends</span><span><span> </span><span>Thread</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>run</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>isInterrupted</span><span>()) { </span><span>//非阻塞过程中通过判断中断标志来退出</span></div></div><div><div><div>4</div></div><div><span>            </span><span>try</span><span> {</span></div></div><div><div><div>5</div></div><div><span>                </span><span>Thread</span><span>.</span><span>sleep</span><span>(</span><span>5</span><span>*</span><span>1000</span><span>);</span><span>//阻塞过程捕获中断异常来退出</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>} </span><span>catch</span><span>(</span><span>InterruptedException</span><span><span> </span><span>e</span><span>) {</span></span></div></div><div><div><div>7</div></div><div><span>                </span><span>e</span><span>.</span><span>printStackTrace</span><span>();</span></div></div><div><div><div>8</div></div><div><span>                </span><span>break</span><span>;</span><span>//捕获到异常之后，执行break跳出循环。</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>进程间通信机制（IPC）<a href="#进程间通信机制ipc"><span>#</span></a></h3><p>进程间通信有四种基本模式：共享内存、消息传递、套接字、信号量</p><p><strong>共享内存：</strong></p><p>一块共享内存区域驻留在生成共享内存段进程的地址空间上，所有希望使用这个共享内存段进行通信的进程必须把这个区域放到进程自己的地址空间上。进程在共享区域内读写来交换信息。</p><p>采用共享内存能够解决生产者——消费者问题，即：为了允许生产者与消费者进程并发执行，要有一个缓冲区同时被生产者填充，并被消费者使用，这个缓冲区就驻留在两个进程的共享内存区域。有两种缓冲：</p><ul>
<li>无限缓冲：缓冲大小没有限制，生产者一直生产新的项，缓冲为空时消费者要等待</li>
<li>有限缓冲：缓冲大小固定，缓冲为空时消费者要等待，缓冲满时生产者要等待</li>
</ul><p><strong>消息传递：</strong></p><p>通过发送和接收消息来传递信息，不必共享内存地址空间。一般实现发送和接收消息操作的方法有：</p><ul>
<li>
<p>管道，又可以分为匿名/命名管道：</p>
<ul>
<li>匿名管道：一个管道和两个进程相连，管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入，这个进程取出被放入管道的信息。由于匿名管道基于fork机制，因此匿名管道只能用于父子进程之间</li>
<li>命名管道：基于文件的路径来识别管道，能让没有亲缘关系的进程也建立连接</li>
</ul>
</li>
<li>
<p>消息队列</p>
<p>通信进程交换的消息驻留在临时队列中，本质上消息队列是消息的链表。可以根据定义队列的容量，改变队列的缓存能力。一般来说，消息队列容量比管道大。</p>
</li>
</ul><p><strong>套接字(Socket)：</strong></p><p>Socket是应用层和传输层之间的一个抽象层，把TCP/IP层的操作抽象成简单接口，供应用层调用。两个进程即便不在同一台计算机，只要有网络连接，也能相互通信。同时Socket的设计也能清楚的将服务器端和客户端区分开。具体工作流程见计算机网络部分。</p><p><strong>信号量：</strong></p><p>信号量（Semaphore）是一个同步对象，用于保持在0至指定整数最大值之间的一个计数值。当线程需要资源时，会对该信号量对象执行wait()操作，信号量计数值减一；当线程释放资源时，会对该信号量对象执行signal()操作，信号量计数值加一。</p></section><section><h3>多线程模型<a href="#多线程模型"><span>#</span></a></h3><p>两种线程：</p><ul>
<li>用户线程：位于用户层，受内核支持，无须内核管理</li>
<li>内核线程：由操作系统直接支持管理</li>
</ul><p>多线程模型：用于提供线程支持</p><ul>
<li>多对一模型：
<ul>
<li>许多用户级线程映射到一个内核线程，线程管理由线程库在用户空间进行</li>
<li>如果一个线程执行阻塞调用，整个进程会被阻塞，因为任意一个时刻，只有一个线程能访问内核</li>
</ul>
</li>
<li>一对一模型：
<ul>
<li>一个线程执行阻塞系统调用时，允许另一个线程继续执行，提供了更好的并发行</li>
<li>创建内核开销大</li>
</ul>
</li>
<li>多对多模型：
<ul>
<li>开发人员可创建任意多的用户线程，相应的内核线程能在多处理器上并发执行</li>
<li>一个线程执行阻塞系统调用时，内核能调度另一个线程执行</li>
</ul>
</li>
</ul></section></section>
<section><h2>I/O模型<a href="#io模型"><span>#</span></a></h2><section><h3>常见I/O模型<a href="#常见io模型"><span>#</span></a></h3><p>阻塞I/O模型(BIO)：</p><ul>
<li>进程发起I/O系统调用后，进程被阻塞，转到内核空间处理，整个I/O处理完毕后返回进程。操作成功则进程获取到数据</li>
<li>进程阻塞挂起不消耗CPU资源，及时响应每个操作</li>
<li>不适用并发量大的应用，因为一个请求I/O会阻塞进程，所以，得为每个请求分配一个处理进程（线程）以及时响应，系统开销大</li>
</ul><p></p><figure><img src="/blog-assets/images/OS/blockingIO.png" alt="blockingIO.png" /><figcaption>blockingIO.png</figcaption></figure><p></p><p>非阻塞I/O模型(NIO)：</p><ul>
<li>进程发起I/O系统调用后，如果内核缓冲区没有数据，需要到I/O设备中读取，进程返回一个错误而不会被阻塞；一旦内核缓冲区有数据，内核就会把数据返回给进程</li>
<li>不会阻塞在内核的等待数据过程，每次发起的I/O请求可以立即返回，不用阻塞等待。在数据量收发不均，等待时间随机性极强的情况下比较常用</li>
<li>进程重复调用recvfrom，试图获取数据，消耗CPU的资源</li>
</ul><p></p><figure><img src="/blog-assets/images/OS/nonblockingIO.png" alt="nonblockingIO.png" /><figcaption>nonblockingIO.png</figcaption></figure><p></p><p>I/O多路复用模型(IO multiplexing)：</p><ul>
<li>
<p>多个的进程的I/O可以注册到一个复用器（select）上，然后用一个进程调用该select，select会监听所有注册进来的I/O， 如果监听的IO在内核缓冲区都没有可读数据，select的调用进程会被阻塞；而当任一IO在内核缓冲区中有可数据时，select调用就会返回。select调用进程可以通知另外的进程（注册进程）再次发起读取IO，读取内核中准备好的数据。</p>
</li>
<li>
<p>除了select，Linux中还拥有几个调用来实现I/O复用的系统调用，例如poll和epoll</p>
<ul>
<li>Select：进程能够监视的文件描述符的数量存在最大限制，注册I/O、阻塞扫描，监听的I/O最大连接数不能多于FD_SIZE；只能无差别轮询所有流；内核需要将消息传递到用户空间，需要内核拷贝动作</li>
<li>Poll：原理和Select相似，只是使用链表保存文件描述符，没有最大连接数的限制；仍然只能无差别轮询所有流；内核需要将消息传递到用户空间，需要内核拷贝动作</li>
<li>Epoll ：event poll，会把哪个流发生了怎样的I/O事件通知我们。所以epoll实际上是事件驱动，只有活跃可用的FD才会调用callback函数；没有最大并发连接的限制，只管“活跃”的连接，而跟连接总数无关；内存拷贝，利用mmap()文件映射内存，让内核和用户空间共享一块内存，减少复制开销</li>
</ul>
</li>
</ul><p></p><figure><img src="/blog-assets/images/OS/IOmultiplexing.png" alt="IOmultiplexing.png" /><figcaption>IOmultiplexing.png</figcaption></figure><p></p><p>异步I/O模型(AIO)：</p><ul>
<li>当进程发起一个I/O操作，进程不被阻塞，继续执行；内核把整个I/O处理完后，会通知进程结果。如果IO操作成功则进程直接获取到数据。</li>
<li>不阻塞，数据一步到位</li>
<li>非常适合高性能高并发应用</li>
</ul><p></p><figure><img src="/blog-assets/images/OS/asyncIO.png" alt="asyncIO.png" /><figcaption>asyncIO.png</figcaption></figure><p></p></section><section><h3>I/O种类对比<a href="#io种类对比"><span>#</span></a></h3><p>同步vs异步：线程的执行过程中，产生一个系统调用，如果需要等待该调用返回才能继续线程流则叫做同步，不需要等待结果返回线程流可以继续往下执行的情况叫做异步。</p><ul>
<li>同步：双方的动作是经过双方协调的，步调一致的</li>
<li>异步：双方并不需要协调，都可以随意进行各自的操作。</li>
</ul><p>阻塞vs非阻塞：线程执行过程中，产生一个系统调用后，如果线程流会被这个调用“堵”住，对应的是阻塞，反之为非阻塞。</p></section></section>
<section><h2>CPU调度<a href="#cpu调度"><span>#</span></a></h2><section><h3>简介<a href="#简介-1"><span>#</span></a></h3><p>每当CPU空闲时，操作系统必须从就绪队列选择一个进程执行，进程选择由短期调度程序或者CPU调度程序执行。</p><p>多道程序的目标是任何时候都有某些进程都在运行，使得CPU的使用率最大化。很多时候，进程执行到一半需要等待（例如等待I/O完成），这时候CPU就会空闲。因此，当进程必须等待时，操作系统会从该进程拿走CPU使用权，将CPU交给其他进程。</p></section><section><h3>长期/短期调度程序<a href="#长期短期调度程序"><span>#</span></a></h3><p>对于批处理系统，进程更多是被提交到磁盘的缓冲池，保存在这里以便以后执行。</p><p>长期调度程序，或作业调度程序，从这个缓冲池里选择进程，装入内存以准备执行。长期调度程序控制着多道程序设计的程度（内存中的进程数量）。
短期调度程序，或CPU调度程序，从准备执行的进程中选择进程，为之分配CPU。
有的操作系统还有中期调度程序，将进程从内存中移出，之后再被重新调入，从中断处继续执行（交换）。</p></section><section><h3>上下文切换<a href="#上下文切换"><span>#</span></a></h3><p>进程上下文一般是用进程进程控制块(PCB)表示，包括CPU寄存器的值、程序计数器、内存管理信息等等。上下文切换指将一个进程的上下文存储到系统内核中，然后将另一个进程的上下文恢复加载到CPU中。前一个进程的执行将在之后任务重新调度执行的时候再次被加载，并保证任务原来的状态不受影响。</p><p>上下文切换保证了多个进程可以共享一个CPU，并且每个任务不会受到其他任务的影响。但它会消耗CPU资源，降低系统的整体性能。</p></section><section><h3>常见CPU调度算法<a href="#常见cpu调度算法"><span>#</span></a></h3><ul>
<li>FCFS：先请求CPU的进程先分配到CPU
<ul>
<li>平均等待时间较长</li>
</ul>
</li>
<li>最短作业优先：CPU优先分配给具有最短CPU区间的进程
<ul>
<li>可证明是最佳，然而需要预知未来，知道下一个CPU区间的长度</li>
</ul>
</li>
<li>优先级调度：每个进程分配优先级，最高优先级的进程分配到CPU
<ul>
<li>低优先级的进程可能会无穷等待(starve)，解决方法是老化(aging)，逐渐增加在系统中等待很长时间的进程优先级</li>
<li>轮转法：定义一个较小的时间单元——时间片，每个进程循环分配不超过一个时间片的CPU，执行时间到了就产生操作系统中断，进行上下文切换，把当前进程移到就绪队列的尾部
<ul>
<li>性能依赖于时间片的大小</li>
</ul>
</li>
<li>多级队列调度：就绪队列被分成多个独立队列，每个进程根据自己的属性，比如内存大小、优先级、进程类型等等，被永久分到其中一个队列中，每个队列有自己的调度算法
<ul>
<li>低调度开销，但不够灵活</li>
</ul>
</li>
<li>多级反馈队列调度：允许进程在队列之中移动，例如某些进程使用过多CPU时间，就会转移到低优先级队列；或者等待时间久的进程会转移到高优先级队列</li>
</ul>
</li>
</ul></section></section>
<section><h2>进程/线程同步<a href="#进程线程同步"><span>#</span></a></h2><section><h3>锁的种类<a href="#锁的种类"><span>#</span></a></h3><ul>
<li>互斥锁和条件变量
<ul>
<li>当获取锁后但是条件失败，那么会释放当前锁(另外的线程可以获得锁，以解除死锁)，然后在此阻塞(避免条件判断需要不但轮询浪费CPU时间)。进程将睡眠等待某种条件出现</li>
<li>一个线程等待”条件变量的条件成立”而挂起；另一个线程使“条件成立”</li>
</ul>
</li>
<li>读写锁
<ul>
<li>允许多个线程同步访问一个文件内存都用读锁；只要有一个线程申请或拥有写锁，其它线程申请或拥有读锁或者写锁，那么申请写锁的必须等待，或者其它线程申请锁必须等待</li>
</ul>
</li>
<li>自旋锁
<ul>
<li>线程反复检查锁是否可用。一旦获取了自旋锁，线程会一直保持该锁，一直到释放自旋锁。线程在这一过程中保持执行，处于忙等待中</li>
<li>避免了进程上下文的调度开销，对于线程只会阻塞很短时间的场合是有效的</li>
</ul>
</li>
</ul></section><section><h3>信号量与互斥锁<a href="#信号量与互斥锁"><span>#</span></a></h3><p>互斥锁（Mutex）是多线程编程中，防止两条线程同时对同一公共资源（比如全局变量）进行读写的机制。</p><p>信号量（Semaphore）是一个同步对象，用于保持在0至指定整数最大值之间的一个计数值。当线程需要资源时，会对该信号量对象执行wait()操作，信号量计数值减一；当线程释放资源时，会对该信号量对象执行signal()操作，信号量计数值加一。</p><p>主要区别：</p><ul>
<li>设计理念上，互斥锁管理的是资源的使用权，主要是构造临界区来保护共享资源；而信号量管理的是资源的数量，同时间接在调度线程，服务于多个线程之间的执行顺序</li>
<li>互斥锁只允许一个线程进入临界区，其他试图进入临界区的线程要全部等待直到这个线程执行完毕。这使得互斥锁安全得多，但是会增加线程等待时间。而信号量仅仅限制了共享资源的数量，在这个限制数量内多个线程可以同时访问这些资源，这带来了更多的并发可能性并且加快了程序运行效率，然而不够安全。</li>
</ul></section><section><h3>虚假唤醒(Spurious Wakeup)<a href="#虚假唤醒spurious-wakeup"><span>#</span></a></h3><p>在多核处理器下，当一个线程调用<code>pthread_cond_signal()</code>后，多个调用<code>pthread_cond_wait()</code>或<code>pthread_cond_timedwait()</code>的线程被激活返回。这种效应成为”虚假唤醒”。</p><p>通常的解决方法是把条件判断从if改成while，不仅在等待条件变量前检查条件变量是否有效，还在等待条件变量后也检查条件变量是否有效。</p></section></section>
<section><h2>死锁<a href="#死锁"><span>#</span></a></h2><section><h3>简介<a href="#简介-2"><span>#</span></a></h3><p>多任务系统下，存在两个以上的进程，其中的每个进程都在等待系统资源，而所需资源本身被自身或其他进程占用。这种状态下，每个进程只能等待其他进程停止运行并释放资源（可能是物理资源或逻辑资源等等）。如果并没有一个进程提前退出，此时这组进程就处于死锁状态。</p><p>触发的条件：</p><ul>
<li>互斥：所需的资源非共享，一次只有一个进程能使用这个资源</li>
<li>占有并等待：一个进程占有一个资源，等待另一个资源，等待的资源被其他资源占有</li>
<li>非抢占：资源只能在进程完成任务后自动释放，不能被中途抢占</li>
<li>循环等待：对于一组等待进程{P, P, … P}，会形成循环等待链，即P等待的资源被P占有，P等待的资源被P占有，…，P等待的资源被P占有</li>
</ul></section><section><h3>预防、检测、解决<a href="#预防检测解决"><span>#</span></a></h3><p>死锁预防：修改系统协议</p><ul>
<li>适当多使用共享资源，比如设立只读文件，让多个进程同时访问</li>
<li>规定进程没有资源了才能申请资源，或执行前一次性获得所有资源确保能执行完毕</li>
<li>一个进程占有资源并申请另一个需要等待的资源时，它已有的资源可以被抢占</li>
<li>对资源类型完全排序，要求进程按递增顺序申请资源</li>
</ul><p>死锁检测：</p><ul>
<li>资源分配图算法，检测图中是否有环</li>
<li>银行家算法，动态比较已分配资源/需要资源/系统可用资源，计算剩余资源是否够用</li>
</ul><p>死锁恢复：</p><ul>
<li>进程终止，包括终止所有进程，或一次性终止一个直到打破死锁循环</li>
<li>抢占资源，优先保证让一些进程先执行完毕，打破死锁循环</li>
</ul></section></section>
<section><h2>内存管理<a href="#内存管理"><span>#</span></a></h2><section><h3>交换(Swap)<a href="#交换swap"><span>#</span></a></h3><p>内存管理器可以将进程暂时从内存中换出到备份存储（一般是磁盘）上，当需要再次执行时再换入到内存中。</p><p>一个交换出的进程可能会换回原有的内存空间，这一限制由地址绑定方式决定。如果绑定在汇编或加载时确定，就必须移动到原有的位置；如果运行时才确定，就可能回到其他物理地址空间上。</p></section><section><h3>连续内存<a href="#连续内存"><span>#</span></a></h3><p>将内存分为多个固定大小的分区(partition)，每个进程位于一个连续的内存区域中，每个分区只能容纳一个进程。</p><p>优点：</p><ul>
<li>实现简单，易于管理</li>
<li>降低逻辑内存到物理内存的映射开销</li>
</ul><p>缺点：</p><ul>
<li>碎片问题，浪费内存空间 (解决：移动空闲空间，合并成一大块)</li>
</ul></section><section><h3>内存分页<a href="#内存分页"><span>#</span></a></h3><p>将物理内存分为固定大小的块（帧），将逻辑内存分为同样大小的块（页）。执行进程时，把页通过页表映射，从备份存储中调入到可用的内存帧中。</p><p>CPU生成的逻辑地址分为两部分：</p><ul>
<li>页号：页表中的索引</li>
<li>页偏移</li>
</ul><p>页表包含每页所在物理内存的基地址，这些基地址和页偏移的组合就形成了物理地址。</p><p></p><figure><img src="/blog-assets/images/OS/address-mapping.png" alt="address-mapping.png" /><figcaption>address-mapping.png</figcaption></figure><p></p><p>分页不会产生外部碎片（总的可用内存空间够容纳进程，但这些内存空间不连续），更好地利用了内存空间，但仍然有内部碎片（给进程分配的内存可能比所需要的要大）</p></section></section>
<section><h2>虚拟内存<a href="#虚拟内存"><span>#</span></a></h2><section><h3>简介<a href="#简介-3"><span>#</span></a></h3><p>计算机系统内存管理的一种技术。它提供了一个抽象的存储资源，它使得应用程序认为它拥有连续的可用的内存（一个连续完整的地址空间）。而实际上，它通常是被分隔成多个物理内存碎片，还有部分暂时存储在外部磁盘存储器上，在需要时进行数据交换。</p><p>虚拟内存有着以下好处：</p><ol>
<li>程序不会受到物理内存空间的限制，所以程序员可以在一个理想的巨大的、连续的虚拟地址空间上进行开发</li>
<li>每个程序使用的物理内存较少，因此可以同时运行更多的程序，提高了CPU的利用率</li>
<li>由于内存隔离，增加了安全性</li>
</ol></section><section><h3>虚拟内存到物理内存的映射<a href="#虚拟内存到物理内存的映射"><span>#</span></a></h3><p>使用内存管理单元将逻辑页面映射到内存的物理页帧：
</p><figure><img src="/blog-assets/images/OS/memory-mapping.png" alt="memory-mapping.png" /><figcaption>memory-mapping.png</figcaption></figure>
访问内存时，系统判断该虚拟地址映射后的结果是否在物理内存中。如果是，就进行地址转换，访问物理内存；否则，将辅存中的部分程序调度进物理内存，再用进行地址转换和访问。<p></p></section><section><h3>页错误<a href="#页错误"><span>#</span></a></h3><p>操作系统有按需调页机制，程序执行时一部分程序被载入到内存，另一部分在二级存储器上。当程序执行需要到某个特定的页，而这个页面不在内存中时，才把它从其他存储器调入内存。</p><p>当进程试图访问尚未调入内存的页时，就会触发页错误。一般的处理流程如下：</p><ol>
<li>先检查进程的内部页表，确定这是不是合法的地址访问，如果不合法进程会被终止</li>
<li>找到一个空闲帧，调度磁盘操作，将需要的页调入</li>
<li>修改页表和进程的内部表，表示该页已经处在内存中</li>
<li>重新执行中断的指令</li>
</ol></section><section><h3>页置换<a href="#页置换"><span>#</span></a></h3><p>当程序运行需要读一个新页面到内存，又没有空闲帧的时候，使用页置换算法选择一个牺牲帧，把这个帧的内容写到磁盘上，修改页表和帧表；再把所需的页面读入腾出来的空闲帧，修改页表和帧表。最后重启用户进程。</p><p>常见算法：</p><ul>
<li>FIFO：选择时间上最早调入内存的页进行替换</li>
<li>最优置换：错误率最低，但要预知未来的页面读入情况，理论上很难实现</li>
<li>LRU：选择最长时间没有使用的页进行替换</li>
<li>LFU / MFU：最不经常 / 最经常使用的页被替换</li>
</ul></section></section>
<section><h2>文件系统<a href="#文件系统"><span>#</span></a></h2><section><h3>存储层次<a href="#存储层次"><span>#</span></a></h3><p>读写速度从快到慢，容量从小到大：</p><ul>
<li>寄存器</li>
<li>缓存</li>
<li>（主）内存</li>
<li>硬盘</li>
<li>软盘、光盘、U盘…</li>
</ul><p>数据无法长期保留在寄存器、缓存、内存中（断电就消失了）；而且这些存储设备容量很小，扩容成本很高。这些问题带来了多层存储的必要性。</p></section><section><h3>缓存友好的代码<a href="#缓存友好的代码"><span>#</span></a></h3><p>两个局部性原则：</p><ul>
<li>时间局部性：某个内存位置被访问后，在不久之后的将来，这个位置可能还会被访问，因此数据可以缓存在原来的位置</li>
<li>空间局部性：将相关的数据放在彼此接近的地方，例如数组中的数据存储在连续的内存中，利于设计缓存机制访问</li>
</ul></section><section><h3>缓存替换策略<a href="#缓存替换策略"><span>#</span></a></h3><ul>
<li>近期最少使用(LRU)：
<ul>
<li>把CPU近期最少使用的块替换出去。这种替换方法需要随时记录Cache中各块的使用情况，以便确定哪个块是近期最少使用的块。每块也设置一个计数器，被调入或者被替换的块，计数器清零，而其它的计数器则加“1”。访问命中缓存块时，这块的计数器也清零。需要替换时，则选择计数值最大的块被替换。</li>
<li>保护了刚调入缓存的新数据块，具有较高的命中率</li>
<li>实现以及维护的开销大</li>
</ul>
</li>
<li>随机替换：
<ul>
<li>随机地确定替换的存储块。设置一个随机数产生器，依据所产生的随机数，确定替换块</li>
<li>方法简单、易于实现</li>
<li>命中率低</li>
</ul>
</li>
<li>先进先出：
<ul>
<li>选择最先调入的缓存块进行替换</li>
<li>命中率比随机替换高一些，总体实现也较为简单</li>
<li>最先调入并被多次命中的块，很可能被优先替换，因而不符合局部性规律</li>
</ul>
</li>
</ul></section><section><h3>磁盘调度算法<a href="#磁盘调度算法"><span>#</span></a></h3><p>磁盘队列：I/O对磁盘各个柱面上块的请求访问顺序</p><ul>
<li>FCFS：先来先服务，通常不是最快的</li>
<li>SSTF：优先处理靠近当前磁头位置的请求</li>
<li>SCAN：磁臂从磁盘一端向另一端移动，磁头经过每个柱面时，处理该柱面上的服务请求；到达另一端时，磁头改变移动方向，继续处理</li>
<li>CSCAN：到达另一端时，磁头直接返回到开始，不处理请求</li>
<li>LOOK：磁头只移动到一个方向上最远的请求为止，之后就掉转方向处理</li>
<li>CLOOK：到达最远请求时，磁头直接返回到开始，不处理请求</li>
</ul></section></section>
<section><h2>磁盘分配<a href="#磁盘分配"><span>#</span></a></h2><ul>
<li>连续内存分配
每个文件都存储在一组连续的块中。顺序访问和直接访问都很容易实现。但是，很难找到新文件的空间（外部碎片）。此外，文件大小很难扩展。</li>
</ul><p></p><figure><img src="/blog-assets/images/OS/contiguous.png" alt="contiguous.png" /><figcaption>contiguous.png</figcaption></figure><p></p><ul>
<li>链式分配
磁盘块通过指针连接。这样一来，文件很容易扩展，而且消除了外部碎片。但是，linkded分配不支持直接访问，且指针会占用一些额外的空间。一个可能的节省空间的方法是将几个块组成一个群组，然而这将引入内部碎片。</li>
</ul><p></p><figure><img src="/blog-assets/images/OS/link.png" alt="link.png" /><figcaption>link.png</figcaption></figure><p></p><ul>
<li>索引分配
每个文件都有一个索引块。第i项指向文件的第i块。在这种情况下，既支持直接访问，也支持顺序访问，而且不存在外部碎片。但是，索引分配浪费一些空间，因为指针和索引块本身都会占用额外的空间。如果块的大小受到限制，可以引入层次索引。</li>
</ul><p></p><figure><img src="/blog-assets/images/OS/index.png" alt="index.png" /><figcaption>index.png</figcaption></figure><p></p></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2022-01-16-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/</id>
      <title type="text">数据结构</title>
      <published>2022-01-16T00:00:00.000Z</published>
      <updated>2022-01-16T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2022-01-16-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
      <summary type="text">常用数据结构。</summary>
      <content type="html"><![CDATA[<p>常用数据结构。</p>

<section><h1>栈和队列(Stack &amp; Queue)<a href="#栈和队列stack--queue"><span>#</span></a></h1><section><h3>性质<a href="#性质"><span>#</span></a></h3><ul>
<li>栈是一种后进先出(LIFO)的线性表，插入和删除数据元素的操作只能在线性表的一端进行。</li>
<li>队列是一种先进先出(FIFO)的线性表。传统的队列中，插入只能在表的一端进行(只进不出)，而删除只能在表的另一端进行(只出不进)。允许插入的一端称为队头，允许删除的一端称为队尾。不过，目前主流语言都支持双头队列，标准比起传统队列相对宽松，允许两头都进，两头都出。</li>
</ul></section><section><h3>时间复杂度<a href="#时间复杂度"><span>#</span></a></h3><p>栈</p><ul>
<li>插入: O(1)</li>
<li>删除: O(1)</li>
<li>查找: O(n)</li>
<li>最值: O(1)</li>
</ul><p>队列</p><ul>
<li>插入: O(1)</li>
<li>删除: O(1)</li>
<li>查找: O(n)</li>
<li>最值: O(1)</li>
</ul></section><section><h2>一般二叉树(Binary Tree)<a href="#一般二叉树binary-tree"><span>#</span></a></h2><section><h3>性质<a href="#性质-1"><span>#</span></a></h3><p>二叉树是有限个节点的集合，这个集合或者是空集，或者是由一个根节点和两株互不相交的二叉树组成，其中一株叫根的做左子树，另一棵叫做根的右子树。</p><ul>
<li>在二叉树中第i层的节点数最多为2（i ≥ 1）</li>
<li>高度为k的二叉树其节点总数最多为2 - 1（k ≥ 1）</li>
</ul></section><section><h3>完全二叉树<a href="#完全二叉树"><span>#</span></a></h3><p>除最后一层外，每一层上的节点数均达到最大值；在最后一层上只缺少右边的若干节点；具有n个节点的完全二叉树的深度为log(n + 1)。</p></section></section><section><h2>二叉搜索树(Binary Search Tree)<a href="#二叉搜索树binary-search-tree"><span>#</span></a></h2><section><h3>性质<a href="#性质-2"><span>#</span></a></h3><p>一种特殊的二叉树，对于二叉搜索树上的每个节点，若它的左子树不空，则左子树上所有节点的值均小于这个节点的值； 若它的右子树不空，则右子树上所有节点的值均大于这个节点的值。</p></section><section><h3>时间复杂度<a href="#时间复杂度-1"><span>#</span></a></h3><ul>
<li>插入: O(logn)</li>
<li>删除: O(logn)</li>
<li>查找: O(logn)</li>
</ul></section></section><section><h2>红黑树(Red Black Tree)<a href="#红黑树red-black-tree"><span>#</span></a></h2><section><h3>性质<a href="#性质-3"><span>#</span></a></h3><p>一种特殊的二叉平衡树，有5个特点:</p><ul>
<li>每个节点可能是红色或黑色</li>
<li>根节点是黑色</li>
<li>有虚拟的黑色NIL叶子</li>
<li>如果某个节点是红色的，它的两个子节点都是黑色的</li>
<li>从一个节点到任意一个虚拟的后代NIL叶子节点的路径上，经过的黑色节点数相等</li>
</ul></section><section><h3>时间复杂度<a href="#时间复杂度-2"><span>#</span></a></h3><ul>
<li>插入: O(logn)</li>
<li>删除: O(logn)</li>
<li>查找: O(logn)</li>
</ul></section><section><h3>应用<a href="#应用"><span>#</span></a></h3><p>Java中的HashMap, TreeMap, TreeSet等</p></section></section><section><h2>堆(Heap)<a href="#堆heap"><span>#</span></a></h2><section><h3>性质<a href="#性质-4"><span>#</span></a></h3><p>一种特殊的完全二叉树。有两种堆：</p><ul>
<li>最小堆，非叶子节点的值不大于左子或右子的值（根节点的值最小）</li>
<li>最大堆，非叶子节点的值不小于左子或右子的值（根节点的值最大）</li>
</ul><p>堆可以应用于priority queue和堆排序</p></section><section><h3>建堆时间 &amp; 空间复杂度<a href="#建堆时间--空间复杂度"><span>#</span></a></h3><p>建堆的两种方法：</p><ul>
<li>forward method，逐个地获取到数据节点，插入到堆中调整位置来构建堆。需要 n * O(logn) = O(nlogn)的时间复杂度。这种方法适合流式传输数据 / 无法提前获取到所有数据的情况</li>
<li>reverse method，在已知所有数据的情况下，从底向上，每一层从右到左，尝试进行父节点和子节点的交换（如果有必要的话）。所有节点的调整时间总和是O(n)。</li>
</ul><p>复杂度分析：
空间复杂度是O(1)，因为是原地操作；对堆进行调整，需要从根节点往下循环查找，需要O(logn)的时间。</p><p></p><figure><img src="/blog-assets/images/DataStructure/heap-time.png" alt="heap-time.png" /><figcaption>heap-time.png</figcaption></figure><p></p></section><section><h3>节点删除后堆的维护<a href="#节点删除后堆的维护"><span>#</span></a></h3><p>先将堆的最后一个元素（最底层，最靠右）移动到根节点，之后从根节点自上而下递归调整，看每个父节点跟子节点是否需要交换。</p></section></section><section><h2>数组 vs. 链表<a href="#数组-vs-链表"><span>#</span></a></h2><section><h3>主要区别<a href="#主要区别"><span>#</span></a></h3><p>数组是线性表，所有元素存储在连续的内存空间中。数组可能是定长的（需要提前申请定量内存），但动态数组(Vector, ArrayList, …)一般是resizable的，达到capacity阈值后容量不断倍增。数组适合高随机访问，少插入/删除的场景。</p><p>链表的元素存储在不连续的内存空间中，每个数据保存了下一个地址的内存数据。不需要定义内存大小。链表适合高插入/删除，少随机访问的场景。</p></section><section><h3>时间复杂度<a href="#时间复杂度-3"><span>#</span></a></h3><p>数组：</p><ul>
<li>插入: 随机位置是O(n)，末尾是O(1)</li>
<li>删除: 随机位置是O(n)，末尾是O(1)</li>
<li>读取: O(1)</li>
</ul><p>链表:</p><ul>
<li>插入: O(1)</li>
<li>删除: O(1)</li>
<li>读取: O(n)</li>
</ul></section></section><section><h2>哈希表(Hash Table)<a href="#哈希表hash-table"><span>#</span></a></h2><section><h3>性质<a href="#性质-5"><span>#</span></a></h3><p>根据关键码值 (Key-Value) 而直接进行访问的数据结构。也就是说，它通过把关键码值映射到表中一个位置来访问记录，以加快查找的速度。</p></section><section><h3>设计注意事项<a href="#设计注意事项"><span>#</span></a></h3><ul>
<li>
<p>构造一个合理的哈希函数</p>
<ul>
<li>对于不同的输入应该产生不同的结果，输出值应该尽量均匀</li>
<li>输入的微小变化会导致输出的较大变化</li>
</ul>
</li>
<li>
<p>解决不同输入，相同输出的冲突问题</p>
<ul>
<li>链地址法，为每个哈希值建立一个单链表，当发生冲突时，将记录插入到链表中。</li>
<li>开放定址法，所有的元素都放在散列表中，用探针不断确定下一个位置来检查所有数据项。要求是表要足够大，一般是所有数据个数的整数倍。</li>
</ul>
</li>
</ul></section><section><h3>时间复杂度<a href="#时间复杂度-4"><span>#</span></a></h3><p>平均而言，哈希表的插入/删除/查找操作时间复杂度是O(1)，但是在最差情况下（链地址法，多次碰撞冲突）会退化到O(n)。</p></section></section><section><h2>字典(Map)<a href="#字典map"><span>#</span></a></h2><section><h3>性质<a href="#性质-6"><span>#</span></a></h3><p>一种存放键值对的容器。有以下几种类型：</p><ul>
<li>
<p>无序哈希表(<code>Hashmap</code> in Java, <code>unordered_map</code> in C++)</p>
<p>本质上是哈希表，将key做hash算法，然后将hash值映射到内存地址，直接取得key所对应的数据。所谓的内存地址即数组的下标索引。不能保证插入的数据是有序的。</p>
</li>
<li>
<p>带双向链表的哈希表(<code>LinkedHashMap</code> in Java)</p>
<p>额外维护了一个双向链表用于保持迭代顺序。以Java的<code>LinkedHashMap</code>为例，其默认实现是按插入顺序排序的。</p>
</li>
<li>
<p>有序哈希表 (<code>TreeMap</code> in Java, <code>map</code> in C++)</p>
<p>本质上是红黑树，插入数据时按照key的大小自动进行排序。<code>TreeMap</code>具备良好的统计性能（例如找最大/最小的key，或者有几个key比3大等等），可以在O(logn)时间内完成。</p>
</li>
</ul></section><section><h3>时间复杂度<a href="#时间复杂度-5"><span>#</span></a></h3><p>无序哈希表:</p><ul>
<li>插入: O(1)</li>
<li>删除: O(1)</li>
<li>查找: O(1)，但是在最差情况下（链地址法，多次碰撞冲突）会退化到O(n)</li>
</ul><p>带双向链表的哈希表:</p><ul>
<li>插入: O(1)</li>
<li>删除: O(1)</li>
<li>查找: O(1)，但是在最差情况下（链地址法，多次碰撞冲突）会退化到O(n)</li>
</ul><p>有序哈希表:</p><ul>
<li>插入: O(logn)</li>
<li>删除: O(logn)</li>
<li>查找: O(logn)</li>
</ul></section></section><section><h2>集合(Set)<a href="#集合set"><span>#</span></a></h2><p>一个不允许出现重复元素的容器。以Java语言为例：</p><ul>
<li>HashSet：基于HashMap实现，插入元素时，所有元素的value都指向一个Object对象，因此HashSet用不到HashMap的value，所以不会为其分配一个内存空间</li>
<li>TreeSet：基于TreeMap实现，操作数据的方法与HashSet调用HashMap类似</li>
<li>LinkedHashSet：基于LinkedHashMap实现，操作数据的方法与HashSet调用HashMap类似</li>
</ul><p>因为Set全部基于Map实现，因此时间复杂度与Map保持一致。</p></section><section><h2>图(Graph)<a href="#图graph"><span>#</span></a></h2><section><h3>性质<a href="#性质-7"><span>#</span></a></h3><p>一种复杂的非线性结构，由节点和边组成。节点之间的关系是任意的，图中任意两个数据元素之间都有可能相关。根据边是否具有指向性，可以将图分为有向图和无向图。</p><p>图一般有以下两种表现形式：</p><ul>
<li>
<p>邻接矩阵</p>
<p>节点之间如果有边相连，用1表示，反之是0。大小: V</p>
</li>
<li>
<p>邻接表</p>
<p>每个节点维护一个链表，存储这个节点分别和其他哪些节点通过边连接。大小: V + 2E (无向图)，V + E (有向图)</p>
</li>
</ul></section><section><h3>复杂度<a href="#复杂度"><span>#</span></a></h3><p>邻接矩阵的空间复杂度: O(V)；邻接表的空间复杂度: O(V + E)</p><ul>
<li>
<p>查找某个节点是否为相邻节点</p>
<p>邻接矩阵: O(1)  邻接表: O(V)</p>
</li>
<li>
<p>列举某个节点的所有相邻节点</p>
<p>邻接矩阵: O(V)  邻接表: O(V)</p>
</li>
</ul></section></section><section><h2>跳表(Skiplist)<a href="#跳表skiplist"><span>#</span></a></h2><section><h3>性质<a href="#性质-8"><span>#</span></a></h3><p>跳表是受这种多层链表的想法的启发而设计出来的特殊数据结构。</p><p>对一个有序链表，通常来说如果要查找某个数据，需要从头开始逐个比较，直到找到包含数据的节点，或者第一个比给定数据大的节点为止（没找到）；假如每相邻两个节点增加一个指针，让指针指向下下个节点，这样所有新增加的指针连成了一个新的链表，但它包含的节点个数只有原来的一半。当我们想查找数据的时候，可以先沿着这个新链表进行查找，当碰到比待查数据大的节点时，再回到原来的链表中进行查找。利用同样的方式，我们可以在上层新产生的链表上，不断为每相邻的两个节点增加一个指针；程序总是从高层先开始访问，然后随着元素值范围的缩小，慢慢降低层次…按照上面生成链表的方式，上面每一层链表的节点个数，是下面一层的节点个数的一半，这样查找过程就非常类似于一个二分查找。</p><p></p><figure><img src="/blog-assets/images/DataStructure/skiplist.png" alt="skiplist.png" /><figcaption>skiplist.png</figcaption></figure><p></p><p>但是，上述方法在插入数据的时候有很大的问题。新插入一个节点之后，会打乱上下相邻两层链表上节点个数严格的2&lt;1的对应关系&gt;。要维持这种对应关系，必须把新插入的节点后面的所有节点（也包括新插入的节点）重新进行调整，这会让时间复杂度重新蜕化成O(n)。删除数据也有同样的问题。跳表为了避免这一问题，它不要求上下相邻两层链表之间的节点个数有严格的对应关系，而是为每个节点随机出一个层数(level)，新插入一个节点不会影响其它节点的层数。因此，插入操作只需要修改插入节点前后的指针，而不需要对很多节点都进行调整。比如，一个节点随机出的层数是3，那么就把它链入到第1层到第3层这三层链表中。以下是一个例子：</p><p></p><figure><img src="/blog-assets/images/DataStructure/skiplist-example.png" alt="skiplist-example.png" /><figcaption>skiplist-example.png</figcaption></figure><p></p><p>执行插入操作时计算随机数的过程十分关键，它并不是一个普通的服从均匀分布的随机数，需要满足一些条件：</p><ul>
<li>每个节点肯定都有第1层指针（每个节点都在第1层链表里）。</li>
<li>如果一个节点有第i层(i &gt;= 1)指针（即节点已经在第1层到第i层链表中），那么它有第(i+1)层指针的概率为<code>p</code>(Redis中取值为0.25)。</li>
<li>节点最大的层数不允许超过一个最大值，记为<code>MaxLevel</code>(Redis中取值为32)。</li>
</ul></section><section><h3>时间复杂度<a href="#时间复杂度-6"><span>#</span></a></h3><ul>
<li>插入：O(logn)</li>
<li>删除：O(logn)</li>
<li>查找：O(logn)</li>
</ul></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2021-12-03-bug-free%E7%9A%84%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/</id>
      <title type="text">Bug Free的二分查找</title>
      <published>2021-12-03T00:00:00.000Z</published>
      <updated>2021-12-03T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2021-12-03-bug-free%E7%9A%84%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/"/>
      <summary type="text">你能写出Bug Free的二分查找算法吗？</summary>
      <content type="html"><![CDATA[<p>你能写出Bug Free的二分查找算法吗？</p>

<section><h2>简介<a href="#简介"><span>#</span></a></h2><p>在连续（且往往是有序的）的序列中搜索指定元素。一般流程是定义起始搜索区间，找到区间的中值，通过不断比较区间中值和目标元素，对半划分调整下一轮的搜索区间，直到找到目标元素或者区间不能被进一步划分。</p><p>尽管二分查找原理很容易理解，但需要考虑到许多corner cases，例如搜索区间的终止条件，区间中值的溢出问题等等，因此写出bug-free的二分查找有一定难度。此外，二分查找的思想在不同的问题情景下有相应变种的使用方法，需要具体问题具体分析。</p><p>在计算区间中值的时候，始终要考虑溢出的情况。此处的溢出指的是采用<code>mid = (first + last) / 2</code>运算。最常见处理溢出的手段就是直接将这个等式进行变形：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>mid </span><span>=</span><span> (first </span><span>+</span><span> last) </span><span>/</span><span> </span></span><span>2</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>=</span><span> (</span><span>2</span><span><span> </span><span>*</span><span> first </span><span>+</span><span> last </span><span>-</span><span> first) </span><span>/</span><span> </span></span><span>2</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>=</span><span> first </span><span>+</span><span> (last </span><span>-</span><span> first) </span><span>/</span><span> </span><span>2</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>此处的除号代表整除。在有的场景下，如果想让中值取值更偏左一些，可以考虑求下位中位数，即<code>mid = first + (last - first - 1) / 2</code>。不过在下文的模型介绍中，我们仍然统一采用标准的中位数取值。</p></section>
<section><h2>模型1<a href="#模型1"><span>#</span></a></h2><section><h3>介绍<a href="#介绍"><span>#</span></a></h3><p>最常使用的模型，条件清晰，不易出错。如果问题场景中可以访问数组中的每一个下标所对应的元素，并且侧重于判断“某个元素是否存在于数组中”，但对于具体存在的下标位置不那么关注，就可以使用它：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>int</span><span> </span><span>search</span><span>(</span><span>int</span><span><span>[] nums</span><span>,</span><span> </span></span><span>int</span><span> target) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>int</span><span> left </span><span><span>=</span><span> </span></span><span>0</span><span><span>,</span><span> right </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>7</div></div><div><span>    </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span> mid </span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>if</span><span><span> (nums[mid] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>11</div></div><div><span>            </span><span>return</span><span><span> mid</span><span>;</span></span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[mid] </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[mid] </span><span>&gt;</span><span> target) {</span></span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>这个模型有三个特点：</p><ul>
<li>将<code>target</code>值和<code>nums[mid]</code>的比较分为了三种情况，严格一一对应了<code>target</code>小于<code>nums[mid]</code>，<code>target</code>等于<code>nums[mid]</code>，<code>target</code>大于<code>nums[mid]</code>三种区间处理方式，最符合人的直觉。换言之，这个模型采用了
“左闭右闭”的原则，<code>mid</code>的两侧的区间分别是<code>[left, mid - 1]</code>和<code>[mid + 1, right]</code></li>
<li>区间的左、右边界是允许重合的，即有可能出现<code>left &lt;= right</code>的情况，此时搜索区间中只有一个数</li>
<li>循环结束时，一定有<code>left &gt; right</code>，这意味着一个无效的搜索区间。如果在此之前没有找到<code>target</code>值，那么可以说明<code>target</code>一定不在数组中</li>
</ul></section><section><h3>sqrt(x)<a href="#sqrtx"><span>#</span></a></h3><p>Given a non-negative integer <code>x</code>, compute and return <em>the square root of</em> <code>x</code>.</p><p>Since the return type is an integer, the decimal digits are <strong>truncated</strong>, and only <strong>the integer part</strong> of the result is returned.</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Example 1:</span></div></div><div><div><div>2</div></div><div><span>Input: x = 4</span></div></div><div><div><div>3</div></div><div><span>Output: 2</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>Example 2:</span></div></div><div><div><div>7</div></div><div><span>Input: x = 8</span></div></div><div><div><div>8</div></div><div><span>Output: 2</span></div></div><div><div><div>9</div></div><div><span>Explanation: The square root of 8 is 2.82842..., and since the decimal part is truncated, 2 is returned.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><p>相当于给定0到<code>x</code>的数组，找到<code>sqrt(x)</code>或者是小于<code>sqrt(x)</code>的最大整数。直接套用模型，如果<code>sqrt(x)</code>存在的话，将其找出；如果不存在的话，由于最后<code>left &gt; right</code>，因此<code>right</code>是最接近且小于<code>sqrt(x)</code>的整数。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>int</span><span> </span><span>mySqrt</span><span>(</span><span>int</span><span> x) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>long</span><span> left </span><span><span>=</span><span> </span></span><span>0</span><span><span>,</span><span> right </span><span>=</span><span> x</span><span>,</span><span> target </span><span>=</span><span> x</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>long</span><span> mid </span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>if</span><span><span> (mid </span><span>*</span><span> mid </span><span>==</span><span> target) {</span></span></div></div><div><div><div>6</div></div><div><span>            </span><span>return</span><span> (</span><span>int</span><span><span>)mid</span><span>;</span></span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (mid </span><span>*</span><span> mid </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>    </span><span>return</span><span> (</span><span>int</span><span><span>)right</span><span>;</span></span></div></div><div><div><div>14</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>Guess Number Higher or Lower<a href="#guess-number-higher-or-lower"><span>#</span></a></h3><p>We are playing the Guess Game. The game is as follows:
I pick a number from <code>1</code> to <code>n</code>. You have to guess which number I picked.
Every time you guess wrong, I will tell you whether the number I picked is higher or lower than your guess.
You call a pre-defined API <code>int guess(int num)</code>, which returns 3 possible results:</p><ul>
<li><code>-1</code>: The number I picked is lower than your guess (i.e. <code>pick &lt; num</code>).</li>
<li><code>1</code>: The number I picked is higher than your guess (i.e. <code>pick &gt; num</code>).</li>
<li><code>0</code>: The number I picked is equal to your guess (i.e. <code>pick == num</code>).</li>
</ul><p>Return <em>the number that I picked</em>.</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Example 1:</span></div></div><div><div><div>2</div></div><div><span>Input: n = 10, pick = 6</span></div></div><div><div><div>3</div></div><div><span>Output: 6</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>Example 2:</span></div></div><div><div><div>7</div></div><div><span>Input: n = 1, pick = 1</span></div></div><div><div><div>8</div></div><div><span>Output: 1</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>Example 3:</span></div></div><div><div><div>12</div></div><div><span>Input: n = 2, pick = 1</span></div></div><div><div><div>13</div></div><div><span>Output: 1</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>Example 4:</span></div></div><div><div><div>17</div></div><div><span>Input: n = 2, pick = 2</span></div></div><div><div><div>18</div></div><div><span>Output: 2</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><hr /><p>题干关于guess API的描述，几乎直接对应了模型的三种情形。需要注意，此题的设定使得一定能找到pick的数，换言之代码一定能在while循环中返回到最终结果，所以while循环之后的后续处理中（找不到<code>target</code>数的情况），随便返回任意数都无所谓。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>extends</span><span><span> </span><span>GuessGame</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>guessNumber</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>, right </span><span>=</span><span> n;</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>5</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>6</div></div><div><span>            </span><span>if</span><span> (</span><span>guess</span><span><span>(mid) </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>                </span><span>return</span><span> mid;</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>guess</span><span><span>(mid) </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>Search in Rotated Sorted Array<a href="#search-in-rotated-sorted-array"><span>#</span></a></h3><p>There is an integer array <code>nums</code> sorted in ascending order (with <strong>distinct</strong> values).</p><p>Prior to being passed to your function, <code>nums</code> is <strong>rotated</strong> at an unknown pivot index <code>k</code> (<code>0 &lt;= k &lt; nums.length</code>) such that the resulting array is <code>[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]</code> (<strong>0-indexed</strong>). For example, <code>[0,1,2,4,5,6,7]</code> might be rotated at pivot index <code>3</code> and become <code>[4,5,6,7,0,1,2]</code>.</p><p>Given the array <code>nums</code> <strong>after</strong> the rotation and an integer <code>target</code>, return the index of <code>target</code> if it is in <code>nums</code>, or <code>-1</code> if it is not in <code>nums</code>.</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Example 1:</span></div></div><div><div><div>2</div></div><div><span>Input: nums = [4,5,6,7,0,1,2], target = 0</span></div></div><div><div><div>3</div></div><div><span>Output: 4</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>Example 2:</span></div></div><div><div><div>7</div></div><div><span>Input: nums = [4,5,6,7,0,1,2], target = 3</span></div></div><div><div><div>8</div></div><div><span>Output: -1</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>Example 3:</span></div></div><div><div><div>12</div></div><div><span>Input: nums = [1], target = 0</span></div></div><div><div><div>13</div></div><div><span>Output: -1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><p>这一题需要将数组对半划分来看，其中一半一定是有序的，而另一半则在中间某处破坏了升序。因此在使用模型1时，我们无法简单通过比较<code>nums[mid]</code>和<code>target</code>确定下一轮搜索区间，而是应该比较<code>nums[left]</code>、<code>nums[mid]</code>和<code>nums[right]</code>三者的值，先判断哪一半数组是有序的；之后将<code>target</code>放进有序的这一侧进行比较，如果<code>target</code>的值介于其中则把区间定为有序的这一侧，反之定为另一侧。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>search</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>            </span><span>// nums[mid] matches with target, return</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (nums[mid] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>13</div></div><div><span>                </span><span>return</span><span> mid;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>// left half is ordered</span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span><span> (nums[left] </span><span>&lt;=</span><span> nums[mid]) {</span></span></div></div><div><div><div>18</div></div><div><span>                </span><span>// target is in left half</span></div></div><div><div><div>19</div></div><div><span>                </span><span>if</span><span><span> (target </span><span>&gt;=</span><span> nums[left] </span><span>&amp;&amp;</span><span> target </span><span>&lt;=</span><span> nums[mid]) {</span></span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>22</div></div><div><span><span>                    </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>            </span><span>// right half is ordered</span></div></div><div><div><div>27</div></div><div><span>            </span><span>if</span><span><span> (nums[mid] </span><span>&lt;=</span><span> nums[right]) {</span></span></div></div><div><div><div>28</div></div><div><span>                </span><span>// target is in right half</span></div></div><div><div><div>29</div></div><div><span>                </span><span>if</span><span><span> (target </span><span>&gt;=</span><span> nums[mid] </span><span>&amp;&amp;</span><span> target </span><span>&lt;=</span><span> nums[right]) {</span></span></div></div><div><div><div>30</div></div><div><span><span>                    </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>32</div></div><div><span><span>                    </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section>
<section><h2>模型2<a href="#模型2"><span>#</span></a></h2><section><h3>介绍<a href="#介绍-1"><span>#</span></a></h3><p>模型1的写法在某些场景下有缺陷。例如给定<code>nums = [1,2,2,2,3]</code>，<code>target = 2</code>，通过模型1得出的<code>target</code>下标就是2。然而在一些场合下，我们更关心的是<code>target</code>在<code>nums</code>中“第一次”，或者“从左到右最初”出现的下标位置，那么下标应该返回1才对。因此，我们需要对模型1进行修改，不仅能适应普通的<code>target</code>查找问题，还能适应这种边界场景下的二分查找：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>int</span><span> </span><span>search</span><span>(</span><span>int</span><span><span>[] nums</span><span>,</span><span> </span></span><span>int</span><span> target) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>int</span><span> left </span><span><span>=</span><span> </span></span><span>0</span><span><span>,</span><span> right </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div><span>    </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span> mid </span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>if</span><span><span> (nums[mid] </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[mid] </span><span>&gt;=</span><span> target) {</span></span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>right </span><span>=</span><span> mid</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span>// return left;</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>    </span><span>if</span><span><span> (left </span><span>!=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> nums[left] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span><span> left</span><span>;</span></span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>    </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>这个模型有几个特点：</p><ul>
<li><code>target</code>值和<code>nums[mid]</code>的比较分为了两种情况，其中<code>left = mid + 1</code>的情况与模型1相同；但<code>right = mid</code>与此前不同，其原因是搜索的策略发生了变化，我们不止希望“找到<code>target</code>”，更希望在找到<code>target</code>之后“尽可能扩张区间”，即我们假定<code>target</code>可能多次出现，所以不立即返回当前下标，而是缩小搜索区间的上界，向左扩张</li>
<li>搜索区间的原则使用“左闭右开”，即<code>[left, right)</code>。这是为了更好契合“边界上第一次出现”的概念，顺便也让代码中可以更少出现+1或-1的边界值检查。根据左闭右开，<code>mid</code>两侧的区间应该写成<code>[left, mid)</code>和<code>[mid+1, right)</code>；同理初始的<code>right</code>值也应该是<code>nums.length</code>而非<code>nums.length - 1</code></li>
<li>循环结束时，一定有<code>left == right</code>。这也是因为采取了左闭右开，因为当<code>left == right</code>时，搜索区间变成了<code>[left, left)</code>，区间的实际长度变成0，搜索也就终止了</li>
<li>如果需要找出<code>target</code>第一次出现的位置，直接返回<code>left</code>即可（<code>right</code>也行，反正此时二者相等）；而如果需要判断<code>target</code>是否在<code>nums</code>中出现，如果在此之前没有找到<code>target</code>值，则需要额外判断最后这个<code>nums[left]</code>是否与<code>target</code>值相等</li>
</ul><p>类似地，如果要进行右边界场景下的二分查找，修改代码如下：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>int</span><span> </span><span>search</span><span>(</span><span>int</span><span><span>[] nums</span><span>,</span><span> </span></span><span>int</span><span> target) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>int</span><span> left </span><span><span>=</span><span> </span></span><span>0</span><span><span>,</span><span> right </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div><span>    </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span> mid </span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>if</span><span><span> (nums[mid] </span><span>&lt;=</span><span> target) {</span></span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[mid] </span><span>&gt;</span><span> target) {</span></span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>right </span><span>=</span><span> mid</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span>// return left - 1;</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>    </span><span>if</span><span><span> (left </span><span>!=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> nums[left </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span><span> left </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>    </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>和左边相比，主要的两处差异在于：</p><ul>
<li>找到<code>target</code>时，不急于返回，而是向右扩大搜索区间，因此当<code>nums[mid] == target</code>时，要增大搜索区间的下界，向右扩张</li>
<li>最后返回的下标是<code>left - 1</code>（<code>right - 1</code>也行，反正此时二者相等），这是因为我们的区间更新策略是让<code>left = mid + 1</code>，最后循环结束时<code>nums[left]</code>一定已经不等于<code>target</code>了，需要倒退一位</li>
</ul></section><section><h3>First Bad Version<a href="#first-bad-version"><span>#</span></a></h3><p>You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the versions after a bad version are also bad.</p><p>Suppose you have <code>n</code> versions <code>[1, 2, ..., n]</code> and you want to find out the first bad one, which causes all the following ones to be bad.</p><p>You are given an API <code>bool isBadVersion(version)</code> which returns whether <code>version</code> is bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Example 1:</span></div></div><div><div><div>2</div></div><div><span>Input: n = 5, bad = 4</span></div></div><div><div><div>3</div></div><div><span>Output: 4</span></div></div><div><div><div>4</div></div><div><span>Explanation:</span></div></div><div><div><div>5</div></div><div><span>call isBadVersion(3) -&gt; false</span></div></div><div><div><div>6</div></div><div><span>call isBadVersion(5) -&gt; true</span></div></div><div><div><div>7</div></div><div><span>call isBadVersion(4) -&gt; true</span></div></div><div><div><div>8</div></div><div><span>Then 4 is the first bad version.</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>Example 2:</span></div></div><div><div><div>12</div></div><div><span>Input: n = 1, bad = 1</span></div></div><div><div><div>13</div></div><div><span>Output: 1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><p>问题需要找出最小的bad version，正好对应左边界场景下的二分查找问题。如果某个版本号不是bad version，就向上搜索版本号；反之向下搜索，看是否还有更小的版本号也是bad version。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/* The isBadVersion API is defined in the parent class VersionControl.</span></div></div><div><div><div>2</div></div><div><span><span>      </span></span><span>boolean isBadVersion(int version); */</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>extends</span><span><span> </span><span>VersionControl</span><span> </span></span><span>{</span></div></div><div><div><div>5</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>firstBadVersion</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>, right </span><span>=</span><span> n;</span></span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span> (</span><span>isBadVersion</span><span><span>(mid) </span><span>==</span><span> </span></span><span>false</span><span>) {</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span> left;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>Find First and Last Position of Element in Sorted Array<a href="#find-first-and-last-position-of-element-in-sorted-array"><span>#</span></a></h3><p>Given an array of integers <code>nums</code> sorted in ascending order, find the starting and ending position of a given <code>target</code> value.
If <code>target</code> is not found in the array, return <code>[-1, -1]</code>.</p><p><strong>Follow up:</strong> Could you write an algorithm with <code>O(log n)</code> runtime complexity?</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Example 1:</span></div></div><div><div><div>2</div></div><div><span>Input: nums = [5,7,7,8,8,10], target = 8</span></div></div><div><div><div>3</div></div><div><span>Output: [3,4]</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>Example 2:</span></div></div><div><div><div>7</div></div><div><span>Input: nums = [5,7,7,8,8,10], target = 6</span></div></div><div><div><div>8</div></div><div><span>Output: [-1,-1]</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>Example 3:</span></div></div><div><div><div>12</div></div><div><span>Input: nums = [], target = 0</span></div></div><div><div><div>13</div></div><div><span>Output: [-1,-1]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><p>分别进行左边界搜索和右边界搜索即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>searchRange</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[] {</span><span>-</span></span><span>1</span><span><span>, </span><span>-</span></span><span>1</span><span>};</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// left</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>11</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (nums[mid] </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[mid] </span><span>&gt;=</span><span> target) {</span></span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>if</span><span><span> (left </span><span>!=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> nums[left] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>result[</span><span>0</span><span><span>] </span><span>=</span><span> left;</span></span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>// right</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>left </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>right </span><span>=</span><span> </span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>26</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>27</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>28</div></div><div><span>            </span><span>if</span><span><span> (nums[mid] </span><span>&lt;=</span><span> target) {</span></span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[mid] </span><span>&gt;</span><span> target) {</span></span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>if</span><span><span> (left </span><span>!=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> nums[left </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>result[</span><span>1</span><span><span>] </span><span>=</span><span> left </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>Find Minimum in Rotated Sorted Array<a href="#find-minimum-in-rotated-sorted-array"><span>#</span></a></h3><p>Suppose an array of length <code>n</code> sorted in ascending order is <strong>rotated</strong> between <code>1</code> and <code>n</code> times. For example, the array <code>nums = [0,1,2,4,5,6,7]</code> might become:</p><ul>
<li><code>[4,5,6,7,0,1,2]</code> if it was rotated <code>4</code> times.</li>
<li><code>[0,1,2,4,5,6,7]</code> if it was rotated <code>7</code> times.</li>
</ul><p>Notice that <strong>rotating</strong> an array <code>[a[0], a[1], a[2], ..., a[n-1]]</code> 1 time results in the array <code>[a[n-1], a[0], a[1], a[2], ..., a[n-2]]</code>.
Given the sorted rotated array <code>nums</code> of <strong>unique</strong> elements, return <em>the minimum element of this array</em>.</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Example 1:</span></div></div><div><div><div>2</div></div><div><span>Input: nums = [3,4,5,1,2]</span></div></div><div><div><div>3</div></div><div><span>Output: 1</span></div></div><div><div><div>4</div></div><div><span>Explanation: The original array was [1,2,3,4,5] rotated 3 times.</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>Example 2:</span></div></div><div><div><div>8</div></div><div><span>Input: nums = [4,5,6,7,0,1,2]</span></div></div><div><div><div>9</div></div><div><span>Output: 0</span></div></div><div><div><div>10</div></div><div><span>Explanation: The original array was [0,1,2,4,5,6,7] and it was rotated 4 times.</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>Example 3:</span></div></div><div><div><div>14</div></div><div><span>Input: nums = [11,13,15,17]</span></div></div><div><div><div>15</div></div><div><span>Output: 11</span></div></div><div><div><div>16</div></div><div><span>Explanation: The original array was [11,13,15,17] and it was rotated 4 times.</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><hr /><p>这一题借鉴了此前Search in Rotated Sorted Array的数组对半划分思想，通过比较<code>nums[left]</code>、<code>nums[mid]</code>和<code>nums[right]</code>确定下一轮的搜索区间。如果<code>nums[mid]</code>不小于边界两个值，说明<code>[left, mid]</code>是一段递增序列，最小值在<code>[mid + 1, right]</code>中；反之，最小值在<code>[left, mid]</code>中。因为我们希望找到数组最小值，根据左边界查找思想，在确定最小值所在范围后我们仍然希望尽量向左扩展范围，试图能在范围中找到更小的值符合要求。代码主干可以写成：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>int</span><span> </span><span>findMin</span><span>(</span><span>int</span><span>[] nums) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>    </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> nums[</span><span>0</span><span><span>]</span><span>;</span></span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>int</span><span> left </span><span><span>=</span><span> </span></span><span>0</span><span><span>,</span><span> right </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span>    </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span> mid </span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// if (mid &gt; 0 &amp;&amp; nums[mid] &lt; nums[mid-1]) {</span></div></div><div><div><div>14</div></div><div><span>        </span><span>//     return nums[mid];</span></div></div><div><div><div>15</div></div><div><span>        </span><span>// }</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>if</span><span><span> (nums[left] </span><span>&lt;=</span><span> nums[mid] </span><span>&amp;&amp;</span><span> nums[right] </span><span>&lt;</span><span> nums[mid]) {</span></span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>right </span><span>=</span><span> mid</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span>return</span><span><span> nums[left]</span><span>;</span></span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>注意代码注释的部分实际上与二分查找算法本身无关，只是用于辅助加速的手段，快速检查<code>mid</code>值是否就是最小值。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2021-12-03-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/</id>
      <title type="text">计算机网络</title>
      <published>2021-12-03T00:00:00.000Z</published>
      <updated>2021-12-03T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2021-12-03-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"/>
      <summary type="text">计算机网络分层介绍。</summary>
      <content type="html"><![CDATA[<p>计算机网络分层介绍。</p>

<section><h1>OSI模型和基础概念<a href="#osi模型和基础概念"><span>#</span></a></h1><section><h2>简介<a href="#简介"><span>#</span></a></h2><p>OSI的全称是Open System Interconnect，中文名叫开放式系统互联，又叫OSI参考模型，是ISO组织在1985年研究的网络互连模型。该体系结构标准定义了网络互连的七层框架（物理层、数据链路层、网络层、传输层、会话层、表示层和应用层）。</p></section><section><h2>分层与职责<a href="#分层与职责"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/ComputerNetwork/OSIModel.png" alt="OSIModel.png" /><figcaption>OSIModel.png</figcaption></figure><p></p><p>自底向上分层介绍：</p><ul>
<li>
<p>物理层
利用传输介质，一般是机械、电子、定时接口的通信信道进行原始的比特流透明传输，为数据链路层提供物理连接。此处强调“透明”，希望是尽可能屏蔽具体传输介质和物理设备的差异，使得数据链路层不需要考虑网络的具体传输介质。</p>
</li>
<li>
<p>数据链路层
进行物理寻址，通过各种差错控制、流量控制等协议，把有差错的物理传输信道转变为可靠的数据链路。
数据链路层通常又分为两个子层，即介质访问控制（MAC）和逻辑链路控制（LLC）两个子层。MAC层主要解决共享网络中，多个用户对信道竞争的问题；LLC层主要负责建立和维护网络连接，执行差错校验，流量控制等等。</p>
</li>
</ul><p>此外，数据链路层接收来自物理层的位流形式的数据，并封装成数据帧，传送到上一层；同样，也将来自上层的数据帧，拆装为位的数据流形式，转发到物理层
主要协议：隧道协议（PPTP），地址解析协议（ARP）</p><ul>
<li>
<p>网络层
建立、维持和终止网络的连接，控制数据链路层与传输层之间的信息转发；通过路由选择算法，为报文或分组通过通信子网时选择最适当的路径。
主要协议：互联网协议（IPv4 &amp; IPv6），路由协议（内部网关，包括RIP，OSPF，… + 外部网关，包括BGP等），控制消息协议（ICMP），组管理协议（IGMP）等</p>
</li>
<li>
<p>传输层
提供会话层和网络层之间的传输服务，即接受其中一方的数据，将数据报文传递到另一层。
在实际运用中，一般是负责两个主机进程之间的通信。因为一个主机可同时运行多个进程，因此运输层有复用（多个应用层进程可同时使用下面运输层的服务）和分用（把收到的信息分别交付给上面应用层中相应的进程）的功能。</p>
</li>
</ul><p>传输层有两种主要协议，一种是较为可靠的、面向连接的TCP协议，另一种是面向无连接的UDP协议。</p><ul>
<li>
<p>会话层
负责为不同机器上的用户进程之间建立及管理会话，保证应用程序之间的同步，同时协调交互工作方式，比如确定双工或者半双工等。</p>
</li>
<li>
<p>表示层
定义应用程序用来交换数据的格式，并负责协议转换、数据编码和数据压缩，使得应用层能正常使用接收到的数据。
例如传输图片的时候，图片格式GIF，JPEG等等就属于表示层。</p>
</li>
<li>
<p>应用层
直接向用户的应用进程提供服务，在其他6层工作的基础上建立与结束应用程序与操作系统之间的联系，协调各个应用程序之间的工作。
根据使用的传输层协议，可以列举一些常见应用层协议：</p>
<ul>
<li>基于TCP：HTTP，FTP，SMTP，POP3，Telnet</li>
<li>基于UDP：DHCP，DNS</li>
</ul>
</li>
</ul></section><section><h2>协议(Protocol)<a href="#协议protocol"><span>#</span></a></h2><p>一个协议定义了在两个或多个通信实体之间交换的报文格式和次序，以及在报文传输和/或接收或其他事件方面所采取的动作。</p></section><section><h2>交换(Switching)<a href="#交换switching"><span>#</span></a></h2><ul>
<li>电路交换(Cirucuit Switching)：沿着端系统通信路径，为端系统之间通信所提供的资源(缓存，链路传输速率)在通信会话期间将会被预留</li>
<li>分组交换(Packet Switching)：会话的报文按需使用上述资源，这将导致可能不得不等待(即排队)接入通信线路</li>
</ul></section></section>
<section><h1>数据链路层<a href="#数据链路层"><span>#</span></a></h1><section><h2>多路访问相关算法<a href="#多路访问相关算法"><span>#</span></a></h2><p>共享网络中，同时只能有一台主机使用一条共享信道，用于传输数据。如果多台主机同时向信道上发送数据，会导致碰撞，所有主机的传输都可能会失败。MAC算法负责解决上述问题。</p><p>载波侦听多路访问/碰撞检测（CSMA/CD）算法（假设信道最长传输时间为a）：</p><ol>
<li>每台主机监听信道，如果监听到信道空闲就传输</li>
<li>之后的2a时间内，主机继续监听信道</li>
<li>如果监测到碰撞，主机会发送一个干扰信号，然后暂停传输</li>
<li>主机会等待一个随机的时间，之后再次开始重传。随机时间范围由指数回退法决定，如果检测到了i次碰撞，等待的时间范围就是[0, 2 - 1] * a</li>
<li>如果碰撞超过16次，传输失败</li>
</ol><p>载波侦听多路访问/碰撞避免（CSMA/CA）算法：
常用于无线网络，无线站点每通过无线局域网发送完一帧后，要等到收到对方的确认帧后才能继续发送下一帧，即链路层确认。802.11规定，所有的站在完成发送后，必须再等待一段很短的时间(继续监听)才能发送下一帧。这段时间通称为帧间间隔IFS (InterFrame Space)，间隔的长短取决于该站要发送的帧的类型。高优先级帧需要等待的时间较短，因此可优先获得发送权，低优先级帧必须等待较长的时间。这样就减少了发生碰撞的机会。</p><p>ALOHA：
基于时隙，把时间分成若干个相同的时间片，所有用户在时间片开始时刻同步接入网络信道，若发生冲突，则必须等到下一个时间片开始时刻再发送。</p></section><section><h2>MAC地址<a href="#mac地址"><span>#</span></a></h2><p>MAC地址全称是Media Access Control Address，又称为以太网地址或物理地址，是用来确认网络设备位置的地址，在网络中唯一标示一个网卡（生产网卡时，烧录MAC地址在网卡上）。</p></section><section><h2>ARP<a href="#arp"><span>#</span></a></h2><p>地址解析协议(Address Resolution Protocol)，用于解析网络层IP地址来寻找数据链路层的MAC地址，实现了从IP地址到MAC地址的映射。
ARP工作的步骤：</p><ol>
<li>主机A向查询主机B的地址，于是在网络中广播了一个ARP request报文，报文中的目标IP地址是主机B的IP</li>
<li>其他主机收到这个ARP request报文，发现目标IP与自己的不符，于是把主机A的IP地址以及MAC地址抄录到自己的ARP缓存表，之后丢弃这个报文</li>
<li>主机B收到ARP request报文并发现目标IP与自己的相符，于是B向A直接发送一个单播ARP reply报文，其中包括了B的IP地址以及MAC地址等信息</li>
<li>主机A收到ARP reply报文，把B的IP地址以及MAC地址抄录到自己的ARP缓存表。</li>
</ol><p>有时，ARP报文也可以用来检测当前主机的IP地址是否与局域网中的其他主机冲突。待检测主机广播一个无关ARP request报文，把源IP地址和目的IP地址都设为自己的，如果收到了来自其他主机的ARP reply，则说明存在IP地址冲突。</p></section></section>
<section><h1>2.5层协议：MPLS<a href="#25层协议mpls"><span>#</span></a></h1><section><h3>简介<a href="#简介-1"><span>#</span></a></h3><p>MPLS（Multi-Protocol Label Switching，多协议标签交换）指的是网络中利用标签引导数据进行快速交换和路由的协议。这样做的好处是避免了在路由表中频繁查询下一跳路由器地址的时间，提高传输效率。</p></section><section><h3>工作原理<a href="#工作原理"><span>#</span></a></h3><p>路由器则根据职责分为两种，一种是边缘标签路由(Label Edge Router, LER)，如果是入口(Ingress node)，将进行初始的路径选择以及MPLS标签的添加，如果是出口(Egress node)，则会去掉MPLS标签，使IP报文回到传统的路由系统中；另一种是标签交换路由(Label Switching Router, LSR)，负责进行MPLS转发。</p><p>MPLS网络中存在若干标签交换通道（Label Switched Path, LSP），每一条LSP是IP报文经过的LSR的集合，可以理解为报文在网络中被转发的路径。</p><p>MPLS的核心是在转发报文是使用标签交换技术。入口的LER基于源IP地址和目的地IP地址，能够预先规划出一条路径，并把路径信息添加在标签中，送往下一跳路由器。所有路由器都根据标签信息，执行特定的标签操作，再把报文转向下一跳节点，直到报文离开MPLS网络。标签操作类型包括push（把MPLS标签插入到IP报文头部），swap（用下一跳分配的标签替换当前栈顶标签）和pop（离开MPLS网络时，从IP报文头部剥离MPLS报文）。</p></section><section><h3>快速重路由(Fast Reroute)<a href="#快速重路由fast-reroute"><span>#</span></a></h3><p>MPLS快速重路由是一种提供快速流量恢复的机制。MPLS路由器不仅会计算出常规路径，还会预先计算出一条备份路由路径。一旦网络中的某条链路或某个节点发生故障，受影响的数据包可以使用备份路径继续快速路由。</p></section></section>
<section><h1>网络层<a href="#网络层"><span>#</span></a></h1><section><h2>IP报文的拆分<a href="#ip报文的拆分"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/ComputerNetwork/IPfragmentation.png" alt="IPfragmentation.png" /><figcaption>IPfragmentation.png</figcaption></figure><p></p></section><section><h2>IP单播、组播、任播、广播<a href="#ip单播组播任播广播"><span>#</span></a></h2><section><h3>术语介绍与比较<a href="#术语介绍与比较"><span>#</span></a></h3><p>这几个术语是IP网络中进行IP数据传输时，几种不同的通信模式。</p><p>单播：</p><ul>
<li>点对点通信，即IP信息的接收和传输只在两个节点之间进行。网络中的交换机和路由器对数据只进行转发不进行复制</li>
<li>优点：服务器能及时相应客户请求，并且便于根据客户不同请求发送不同数据，实现个性化服务</li>
<li>缺点：速度慢，消耗的带宽大（想象同一份报文要发给100个客户机）</li>
</ul><p>组播：</p><ul>
<li>点对多通信，在一次传输中向多个接收者同时发送IP数据包。在发送时，有多播组这个概念，每个多播组就是一组当前数据包的接收者。每个组有一个标识符，一般来说是用一个224.0.0.0 ~ 239.255.255.255之间的IP地址作为这个标识符</li>
<li>网络中的交换机和路由器只向有需求者复制并转发其所需数据，既能一次将数据传输给多个组内的主机，又不影响其他组外的主机的通讯</li>
<li>优点：结合了单播和广播的优点，按需转发数据，节省带宽，并且可以在互联网上使用</li>
<li>缺点：没有纠错机制，发生丢包或错包之后不好弥补</li>
</ul><p>广播：</p><ul>
<li>点对多通信，使用广播地址255.255.255.255，将消息发送到在同一广播网络上的每个主机，网络对其中每一台主机发出的信号都进行无条件复制并转发，所有主机都可以接收到所有信息（不管是否需要）</li>
<li>优点：服务器不用单独向客户机单独发送数据，流量负载低；布置设备和维护设备也比较简单</li>
<li>缺点：广播不能在互联网上使用；每台主机转发了很多其他主机不需要的报文，浪费带宽</li>
</ul><p>任播：</p><ul>
<li>点对点通信，任播允许源节点向一组目标节点中的其中一个发送数据包，而这个节点由路由系统选择，对源节点透明。</li>
<li>优点：路由系统往往选择“最近”的节点为源节点提供服务，从而在一定程序上为源节点提供了更好的服务也减轻了网络负载。</li>
<li>缺点：不能保证每个目标节点都收到数据，并且速度慢</li>
</ul></section><section><h3>IP组播路由算法<a href="#ip组播路由算法"><span>#</span></a></h3><p>组播路由协议用于在路由器之间共享组信息，为组播数据报的分发提供路由，确保每一个组播路由器都能收到数据包。它的目标是找出一棵树，它连接所有附接主机属于组播组的路由器；根据这棵树路由组播包从发送者到达属于这棵组播树的所有主机。</p><p>一般有两种树：</p><ul>
<li>共享组播树：构造出的树的链路和成本最小，但是组播源必须将组播数据首先发送给树根节点，之后树根节点再根据这棵树发送给所有节点。</li>
<li>基于源的树：以发送者为树根到每一个接收者的最短路径构成一棵转发树，从发送者到接收者的路径最优，但需要维护较多的状态信息。（使用Dijkstra算法构造）</li>
</ul></section><section><h3>管理IP组播成员(IGMP)<a href="#管理ip组播成员igmp"><span>#</span></a></h3><p>通过IGMP（Internet Group Management Protocol，互联网组管理协议）进行管理。这个协议让主机能和与其连接的路由器进行IGMP消息传输。</p><p>一般来说，有三种类型的IGMP消息：</p><ul>
<li>membership_query：路由器向所有与其连接的主机发送，检查这些主机目前加入的所有的组</li>
<li>membership_report：主机用这种消息答复membership_query，汇报自己加了哪些组。也有可能主机刚加入一个组时，主动生成这种消息向路由器汇报</li>
<li>leave_group：当一个主机离开一个组时，由主机或者路由器发送的一条可选的消息</li>
</ul></section></section><section><h2>ICMP<a href="#icmp"><span>#</span></a></h2><p>互联网控制消息协议（Internet Control Message Protocol），用于在IP主机、路由器之间传递控制消息，包括网络是否通畅、主机是否可达、路由是否可用等等。
以Ping命令为例，输入Ping之后，源主机会构造一个ICMP Echo的请求数据包，由ICMP协议将数据包以及目标地址交给IP层协议；IP层协议将上述内容封装成IP数据包，通过ARP找出目标主机对应MAC地址，把报文传给数据链路层，由数据链路层根据MAC地址找到目标主机。目标主机检查MAC地址并与自己比对，比对成功后，层层返回，由ICMP协议构建ICMP reply包返回给源主机。</p></section><section><h2>RIP<a href="#rip"><span>#</span></a></h2><p>路由信息协议（Routing Information Protocol）是一种较为简单的内部网关协议，基于距离矢量（Distance-Vector）算法，用跳数（Hop Count）作为度量来衡量到达目的网络的距离。每个设备到与其直连的设备之间跳数为0，然后每经过一个三层设备跳数增加1。
RIP规定度量值取0～15之间的整数，大于或等于16的跳数被定义为无穷大，即目的网络或主机不可达。由于这个限制，使得RIP不可能在大型网络中得到应用</p></section><section><h2>OSPF<a href="#ospf"><span>#</span></a></h2><section><h3>简介<a href="#简介-2"><span>#</span></a></h3><p>开发最短路径优先协议(Open Shortest Path First)是一种链路状态路由协议，基于Dijkstra算法来找出每个报文被转发到达所有目的地所需要的最短路径。具体而言，每个路由器都把自己当成根结点，根据累积的成本值（参考带宽/接口带宽）计算到达目的地的最小成本。
OSPF的核心是多种形式的链路状态通告（Link State Advertisement），LSA用来描述网络的拓扑信息。当路由器初始化或当网络结构发生变化（例如增减路由器，链路状态发生变化等）时，路由器会产生LSA包，该数据包里包含路由器上所有相连的链路，也即为所有端口的状态信息，这些LSA会在OSPF域中传播。不同类型的LSA共同描述了OSPF域内的网络拓扑结构。所有的LSA都保存在LSDB中，根据LSDB中的信息使用Dijkstra算法计算最佳路径，得到OSPF路由表。</p></section><section><h3>报文类型<a href="#报文类型"><span>#</span></a></h3><ul>
<li>Hello：建立和维护网络中的OSPF邻居关系，由每台主机周期性地发送。在支持组播或广播的物理网络上，Hello包使用组播地址（通常为224.0.0.5)发送</li>
<li>Database Description：两台路由器初始建立邻居关系时，使用这个报文描述自己的LSDB，进行数据库同步</li>
<li>Link State Request：两台路由器互相交换过DD报文之后，知道对方路由器有哪些LSA是本地的LSDB所缺少的，哪些LSA是已经失效的，这时需要发送LSR报文向对方请求自己所需的LSA</li>
<li>Link State Update：用来向对方路由器发送其所需要的LSA。在支持组播和广播的链路上是以组播形式将LSA泛洪出去。内容是多条LSA的集合</li>
<li>Link State Acknowledgement：对LSU中的LSA进行确认</li>
</ul></section><section><h3>默认路由<a href="#默认路由"><span>#</span></a></h3><p>OSPF默认路由是0.0.0.0/0，它匹配了所有可能的前缀。如果没有为给定的目的地址设置特定的路由，或者目的地址不在路由表中，OSPF数据包将通过默认路由转发。一般来说，默认路由会将数据包转发到另一个路由器，直到有一个路由器知道如何将数据包转发到目的地，并据此将数据包发送出去。</p></section><section><h3>网络中的被动接口<a href="#网络中的被动接口"><span>#</span></a></h3><p>被动接口的设置是用来控制LSA和节约资源的。将接口设置为被动接口后，该接口将停止发送OSPF Hello数据包，并且不能与其他路由器建立邻居关系。因此，该接口也不会接收和发送OSPF数据包。如果在实际的网络中，有一些接口不需要接收OSPF路由信息，我们可以将其设置为被动，以此节省网络资源，减少路由器的负担。</p></section></section></section>
<section><h1>传输层<a href="#传输层"><span>#</span></a></h1><section><h2>Socket<a href="#socket"><span>#</span></a></h2><section><h3>Socket简介与通信流程<a href="#socket简介与通信流程"><span>#</span></a></h3><p>Socket是应用层和传输层之间的一个抽象层，把TCP/IP层的操作抽象成简单接口，供应用层调用。两个进程即便不在同一台计算机，只要有网络连接，也能相互通信。同时Socket的设计也能清楚的将服务器端和客户端区分开。</p><p>服务器端</p><ol>
<li>调用socket创建一个套接字</li>
<li>调用bind给套接字绑定命名</li>
<li>调用listen创建一个队列，用于存放所有的客户连接</li>
<li>调用accept，等待客户端建立对套接字的连接，只有客户端连接到之前参数指定的套接字上时才返回，也就是说，如果套接字队列中没有未处理的连接，accept将阻塞直到有客户建立连接为止。注意此时会创建一个与原有的命名套接不同的新套接字，这个套接字只用于与这个特定客户端进行通信，而原来的命名套接字则被保留下来继续处理来自其他客户的连接。</li>
<li>完成通信后，调用close关闭套接字</li>
</ol><p>客户端</p><ol>
<li>调用socket创建一个套接字</li>
<li>将服务器的命名套接字作为地址</li>
<li>调用connect与服务器建立连接</li>
<li>完成通信后，调用close关闭套接字</li>
</ol></section><section><h3>Socket底层实现<a href="#socket底层实现"><span>#</span></a></h3><p>一般来讲，我们可以认为TCP连接上发送的所有字节序列在某一瞬间被分成了3个FIFO的字节流队列：</p><ol>
<li>SendQ：在发送端底层实现中缓存的字节，这些字节已经写到了OutputStream中，但还没被接收端成功接收。</li>
<li>RecvQ：在接收端底层实现中缓存的字节，这些字节等待分配到接收程序——即从InputStream中通过<code>read()</code>方法读取。</li>
<li>Delivered：接收者从输入流已经读取到的字节。</li>
</ol><p>Socket的工作流程：</p><ul>
<li>当我们调用OutputStream的<code>write()</code>方法时，将向SendQ追加字节。</li>
<li>TCP协议负责将字节按顺序从SendQ移动到RecvQ。这里有重要的一点需要明确：这个转移过程无法由用户程序控制或直接观察到，并且在块中发生，这些块的大小在一定程度上独立于传递给<code>write()</code>方法的缓冲区大小。</li>
<li>接收程序从Socket的InputStream读取数据时，字节就从RecvQ移动到Delivered中，而转移的块的大小依赖于RecvQ中的数据量和传递给read()方法的缓冲区的大小。</li>
</ul><p>不能假设在连接的一端将数据写入输出流和在另一端从输入流读出数据之间有任何的一致性。尤其是在发送端由单个输出流的<code>write()</code>方法传输的数据，可能会通过另一端的多个输入流的<code>read()</code>方法获取，而一个<code>read()</code>方法可能会返回多个<code>write()</code>方法传输的数据。</p></section></section><section><h2>TCP<a href="#tcp"><span>#</span></a></h2><section><h3>简介与主要特点<a href="#简介与主要特点"><span>#</span></a></h3><p>TCP(Transmission Control Protocol, 传输控制协议)是一个可靠的、面向连接的、基于字节流的传输层通信协议。</p><ul>
<li>端到端，因此总是一台sender，一台receiver</li>
<li>面向连接，有三次握手和四次挥手过程</li>
<li>可靠，能够保证传输的数据包按照顺序全部送达</li>
<li>拥塞控制，防止发送端将过多数据发出
<ul>
<li>慢启动，连接开始时发送方维持一个拥塞窗口的变量<code>cwnd</code>，每收到一次ACK就指数倍增<code>cwnd</code></li>
<li>拥塞避免，让拥塞窗口缓慢增长，即每经过一个往返时间RTT就把发送方的拥塞窗口<code>cwnd</code>加1，这样拥塞窗口按线性规律缓慢增长。</li>
<li>快速重传，如果收到同一个ACK超过3次就重新发送带有最小Seq Number的未确认包</li>
<li>快速恢复，把慢启动的阈值<code>ssthresh</code>减半</li>
</ul>
</li>
<li>流量控制，防止发送段发出的数据量超出接收端
<ul>
<li>接收端有一个缓冲区，同时又一个滑动窗口变量<code>rwnd</code>。每次回应的ACK报文中就会附带这个窗口值，表示着自己此刻还能接收多少字节的报文。当这个窗口太小，那发送方只能按照这个窗口去发送数据</li>
</ul>
</li>
<li>双工，一个连接中存在两个方向的数据传输</li>
</ul><p>TCP报头结构：
</p><figure><img src="/blog-assets/images/ComputerNetwork/TCPheader.png" alt="TCPheader.png" /><figcaption>TCPheader.png</figcaption></figure><p></p></section><section><h3>Seq和ACK<a href="#seq和ack"><span>#</span></a></h3><p>初始序号:
当新连接建立的时候，第一个字节数据的序号称为ISN(Initial Sequence Number)，即初始序号。ISN一开始并不一定就是1。ISN的生成取决于时间与哈希算法，时间指的是一个计时器，每隔4毫秒加1。哈希算法则根据源IP、目的IP、源端口、目的端口生成一个随机数值。</p><p>序列号(Sequence Number): 32位，有两个作用：</p><ul>
<li>SYN为1时，是当前连接的ISN，数据的第一个字节序号是ISN + 1</li>
<li>SYN是0时，是当前连接报文段累计数据包的字节数</li>
</ul><p>确认号(Acknowledgment Number): 32位，有以下特点：</p><ul>
<li>接收方期待的下一个报文段的序列号</li>
<li>在TCP协议中，一般采用累积确认的方式，即每传送多个连续TCP段，可以只对最后一个TCP段进行确认</li>
</ul></section><section><h3>三次握手、四次挥手<a href="#三次握手四次挥手"><span>#</span></a></h3><p>TCP三次握手过程状态图：
</p><figure><img src="/blog-assets/images/ComputerNetwork/TCP-handshake.png" alt="TCP-handshake.png" /><figcaption>TCP-handshake.png</figcaption></figure><p></p><p>TCP四次握手过程状态图：
</p><figure><img src="/blog-assets/images/ComputerNetwork/TCP-closing.png" alt="TCP-closing.png" /><figcaption>TCP-closing.png</figcaption></figure><p></p><p>状态解释：</p><ul>
<li>LISTEN:       侦听来自远方的TCP端口的连接请求</li>
<li>SYN-SENT:     在发送连接请求后等待匹配的连接请求</li>
<li>SYN-RECEIVED: 在收到和发送一个连接请求后等待对方对连接请求的确认</li>
<li>ESTABLISHED:  代表一个打开的连接</li>
<li>FIN-WAIT-1:   等待远程TCP连接中断请求, 或先前的连接中断请求的确认</li>
<li>FIN-WAIT-2:   从远程TCP等待连接中断请求</li>
<li>CLOSE-WAIT:   等待从本地用户发来的连接中断请求，一般是等上层应用做好准备关闭连接</li>
<li>CLOSING:      等待远程TCP对连接中断的确认</li>
<li>LAST-ACK:     上层应用程序调用close关闭连接，发送FIN，等待远程TCP的连接中断请求的确认</li>
<li>TIME-WAIT:    等待足够的时间以确保远程TCP接收到连接中断请求的确认</li>
<li>CLOSED:        没有任何连接状态</li>
</ul><p>三次握手详解：</p><ol>
<li>客户端向服务器端发送一个含有同步序列号(SYN)标志位的数据段给服务器端，向服务器端请求建立连接。数据包中，初始序列号(ISN)是客户端随机产生的值，确认号是0</li>
<li>服务器端收到客户端的请求后，用一个带有确认应答（ACK）和同步序列号（SYN）标志位的数据段响应客户端。数据包中，序列号是服务器随机产生的一个值，确认号是客户端ISN + 1</li>
<li>客户端收到这个数据段后，再发送一个确认应答，确认已收到服务器端的数据段。数据包中，序列号是服务器端返回的确认号 + 1，确认号是服务器的序列号 + 1</li>
</ol><p>三次握手的的作用就是预告双方即将建立连接开始通信，并且双方都能明确自己和对方的收发能力是正常的；同时客户端和服务端交换初始序列号(Initial Sequence Number), 以便让对方知道接下来接收数据的时候如何按序列号组装数据。</p><ol>
<li>客户端发包，服务端收到了。服务端因此能得出结论：客户端的发送能力、服务端的接收能力是正常的</li>
<li>服务端发包，客户端收到了。客户端因此能得出结论：服务端的接收、发送能力，客户端的接收、发送能力是正常的</li>
<li>客户端发包，服务端收到了。服务端因此能得出结论：客户端的接收、发送能力，服务端的发送、接收能力是正常的</li>
</ol><p>四次挥手详解：</p><ol>
<li>客户端完成数据传输，将控制位FIN设为1并发送给服务器，提出停止TCP连接的请求。数据包中，包含一个希望接收者看到的自己当前的序列号K. 同时还包含一个ACK表示确认对方最近一次发过来的数据。</li>
<li>服务器端收到FIN后对其作出响应，确认客户端 -&gt; 服务器端方向上的TCP连接将关闭，将ACK设为1并发送给客户端。数据包中，服务端将K值加1作为ACK序号值。</li>
<li>服务器端再提出服务器端 -&gt; 客户端方向上的TCP连接关闭请求，将FIN设为1并发送给客户端。数据包中，服务端发起自己的FIN段，ACK=K+1, Seq=L</li>
<li>客户端收到FIN后对其作出响应，将ACK设为1并发送给服务器端，双方向的TCP连接关闭结束。数据包中，客户端确认。ACK=L+1</li>
</ol><p>四次挥手确保两个方向的TCP连接都被关闭。</p><p>握手时，服务端在LISTEN状态下，收到建立连接请求的SYN报文后，把ACK和SYN放在一个报文里发送给客户端；
挥手时，当收到对方的FIN报文时，仅仅表示对方不再发送数据了但是还能接收数据，己方是否现在关闭发送数据通道，需要上层应用来决定，因此，己方ACK和FIN一般都会分开发送。</p></section><section><h3>TCP粘包<a href="#tcp粘包"><span>#</span></a></h3><p>保护消息边界：就是指传输协议把数据当作一条独立的消息在网上传输，接收端只能接收独立的消息。也就是说存在保护消息边界，接收端一次只能接收发送端发出的一个数据包。而面向流则是指无保护消息保护边界的，如果发送端连续发送数据，接收端有可能在一次接收动作中，会接收两个或者更多的数据包。</p><p>TCP粘包：发送方发送的若干包数据到接收方接收时粘成一包，从接收缓冲区看，后一包数据的头紧接着前一包数据的尾。这个只会在流传输中出现，并且既可能由发送方引起，也可能由接收方引起：</p><ul>
<li>发送方引起的粘包是由TCP协议本身造成的，TCP为提高传输效率，发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少，通常TCP会根据优化算法把这些数据合成一包后一次发送出去，这样接收方就收到了粘包数据。</li>
<li>接收方引起的粘包是由于接收方用户进程不及时接收数据，从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区，用户进程从该缓冲区取数据，若下一包数据到达时前一包数据尚未被用户进程取走，则下一包数据放到系统接收缓冲区时就接到前一包数据之后，而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据，这样就一次取到了多包数据。</li>
</ul><p>解决方法：</p><ul>
<li>发送固定长度的消息，指定好消息的长度，可以用while循环检查当前已发送的字节长度和剩余的未发的长度，确保不会遗漏</li>
<li>消息长度与消息一同发送，可以把int类型的消息长度转化成byte格式，用一个2字节的byte[]数组存储，发给接收方</li>
<li>在接收方添加一个线程，用于接受到数据后进行预处理
<ul>
<li>将待处理的接收数据流（假设长度为m）强行转换成预定的结构数据形式，并从中取出结构数据长度字段（假设长度为n）</li>
<li>若n &lt; m，则表明数据流包含多包数据，从其头部截取n个字节存入临时缓冲区，剩余部分数据依此继续循环处理</li>
<li>若n = m，则表明数据流内容恰好是一完整结构数据，直接将其存入临时缓冲区即可</li>
<li>若n &gt; m，则表明数据流内容尚不够构成一完整结构数据，需留待与下一包数据合并后再行处理</li>
</ul>
</li>
</ul></section></section><section><h2>UDP<a href="#udp"><span>#</span></a></h2><section><h3>简介<a href="#简介-3"><span>#</span></a></h3><p>UDP(User Datagram Protocol, 用户数据报协议)是一个非连接的协议，无需建立连接就可以发送封装的IP数据包。具有以下特点：</p><ul>
<li>传输数据之前源端和终端不建立连接(因此也没有握手过程)，需要传送时就抓取来自应用程序的数据，并尽快将其发送</li>
<li>在发送端，UDP传送数据的速度受应用程序生成数据的速度、 计算机的能力和传输带宽的限制； 在接收端，UDP把每个消息段放在队列中，应用程序每次从队列中读一个消息段。</li>
<li>不需要维护连接状态，包括收发状态等，因此一台服务机可同时向多个客户机传输相同的消息</li>
<li>UDP使用尽最大努力交付，不保证可靠交付</li>
</ul><p>UDP报头结构：
</p><figure><img src="/blog-assets/images/ComputerNetwork/UDPheader.png" alt="UDPheader.png" /><figcaption>UDPheader.png</figcaption></figure><p></p></section><section><h3>优缺点和应用<a href="#优缺点和应用"><span>#</span></a></h3><p>优点：</p><ul>
<li>没有建立连接的过程，简化了设计并且节省时间</li>
<li>UDP报文头部很小，只有8字节，节省了很多额外开销</li>
<li>吞吐量不受拥塞控制算法的调节，只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制</li>
</ul><p>缺点:</p><ul>
<li>丢包问题</li>
<li>即便数据成功传送，数据包的顺序也可能是错乱的</li>
</ul><p>应用：</p><ul>
<li>DNS</li>
<li>流媒体应用(视频聊天软件，网络游戏等允许丢包，但注重传输率)</li>
</ul></section></section></section>
<section><h1>应用层<a href="#应用层"><span>#</span></a></h1><section><h2>HTTP和HTTPS<a href="#http和https"><span>#</span></a></h2><section><h3>HTTP简介与实现<a href="#http简介与实现"><span>#</span></a></h3><p>HTTP协议指超文本传输协议(Hyper Text Transfer Protocol)，是从WEB服务器传输HTML到本地浏览器的传送协议。设计HTTP目的是提供一种发布和接收HTML页面的方法。
HTTP的实现基于TCP/IP通信协议，默认端口是80。一般的HTTP传输过程如下:</p><ol>
<li>
<p>客户端发起TCP请求，与服务端3次握手建立连接</p>
</li>
<li>
<p>客户端向服务端发起HTTP请求。请求报文包括：</p>
<ul>
<li>请求行(Request line)，包括请求方法(GET, POST)，URL(统一资源定位符，定位具体的资源位置)，协议/版本</li>
<li>请求头(Header line)，包括origin，user-agent, connection是否持久等等</li>
<li>请求数据，GET中不包含，往往存在于POST方法中</li>
</ul>
</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>GET /somedir/page.html HTTP/1.1</span></div></div><div><div><div>2</div></div><div><span>Host: www.someschool.edu</span></div></div><div><div><div>3</div></div><div><span>Connection: close</span></div></div><div><div><div>4</div></div><div><span>User-agent: Mozilla/4.0</span></div></div><div><div><div>5</div></div><div><span>Accept-language: fr</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>服务端向客户端发送HTTP响应。响应报文包括：
<ul>
<li>状态行(Status line)，包括协议/版本，状态码，响应状态信息</li>
<li>响应头(Header line)，包括时间戳，返回内容的类型、编码、长度等信息</li>
<li>响应正文</li>
</ul>
</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>HTTP/1.1 200 OK</span></div></div><div><div><div>2</div></div><div><span>Connection: close</span></div></div><div><div><div>3</div></div><div><span>Date: Thu, 03 Jul 2003 12:00:15 GMT</span></div></div><div><div><div>4</div></div><div><span>Server: Apache/1.3.0 (Unix)</span></div></div><div><div><div>5</div></div><div><span>Last-Modified: Sun, 6 May 2007 09:23:24</span></div></div><div><div><div>6</div></div><div><span>Content-Length: 6821 Content-Type:text/html</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>客户端将响应得到的HTML代码和资源渲染到前端</li>
</ol></section><section><h3>HTTP的优缺点<a href="#http的优缺点"><span>#</span></a></h3><p>优点：</p><ul>
<li>简单快速：客户向服务器请求服务时，只需传送请求方法和路径</li>
<li>灵活：HTTP允许传输任意类型的数据对象。传输的类型由Content-Type加以标记</li>
</ul><p>缺点:</p><ul>
<li>无连接 &amp; 无状态：限制每次连接只处理一个请求。服务器处理完请求，并收到客户的应答后，即断开连接，但是却不利于客户端与服务器保持会话连接；后续事务处理如果需要前面的信息，则必须重传数据 (使用Session和Cookie解决)</li>
<li>请求信息明文传输，容易被窃听截取</li>
<li>没有验证对方身份，存在冒充危险</li>
</ul></section><section><h3>HTTPS简介与实现<a href="#https简介与实现"><span>#</span></a></h3><p>SSL(Secure Socket Layer，安全套接字层)协议位于TCP/IP协议与各种应用层协议之间，为数据通讯提供安全支持。SSL后来发展成TLS（Transport Layer Security，传输层安全）。
HTTPS协议（HyperText Transfer Protocol over Secure Socket Layer）：一般理解为HTTP+SSL/TLS，通过SSL证书来验证服务器的身份，并为浏览器和服务器之间的通信进行加密。默认端口是443。实现流程如下：</p><ol>
<li>客户端通过URL访问服务器建立SSL连接</li>
<li>服务端收到客户端请求后，会将网站支持的证书信息（证书中包含公钥）传送给客户端</li>
<li>客户端的服务器开始协商SS连接的的信息加密等级，也就是信息加密的等级</li>
<li>客户端产生随机对称密钥，再用公钥对这个对称密钥进行加密</li>
<li>客户端将加密后的对称密钥发送给服务器，服务器用私钥解密出会话密钥</li>
</ol><p>至此，客户端和服务器能够通过对称密钥加密的密文进行通信。</p><p>补充此处非对称加密的最常用算法：RSA算法，基于质数，即很难对很大的整数做因式分解，因此很可靠</p></section><section><h3>HTTPS的优缺点？<a href="#https的优缺点"><span>#</span></a></h3><p>优点：</p><ul>
<li>通信双方能够验证彼此的身份合法</li>
<li>通信的内容被加密，不易被窃听截取</li>
</ul><p>缺点:</p><ul>
<li>HTTPS多次握手，导致页面加载时间显著变长</li>
<li>SSL涉及的安全算法对服务器资源消耗大</li>
<li>SSL证书需要钱，功能越强大费用越高</li>
</ul></section><section><h3>Cookie<a href="#cookie"><span>#</span></a></h3><p>HTTP 服务器是无状态的，因此需要辅助使用Cookie保存用户信息。它类似一个用户令牌，是服务器在客户端本地机器上存储的一小段带有状态信息文本，并随着每次请求发送到服务器。服务器通过Cookie能够区别具体正在与哪一个客户端通信。</p><p>Cookie的四个组成部分：</p><ul>
<li>在 HTTP 响应报文中有一个cookie首部行</li>
<li>在 HTTP 请求报文中有一个cookie首部行</li>
<li>在用户端系统中保留有一个cookie文件，由用户的浏览器管理</li>
<li>在 Web 站点有一个后端数据库</li>
</ul><p>具体工作机制（往往是与Session结合）：</p><ol>
<li>浏览器首次访问页面，若页面使用cookie，则在返回信息中加上set-cookie: COOKIE_ID</li>
<li>浏览器把COOKIE_ID写入本地 cookie 文件中</li>
<li>浏览器再次访问该页面时，先查找cookie文件中有没有对应的cookie，若有则加上所带信息</li>
<li>服务器收到消息后，根据COOKIE_ID查询数据库，从而找出用户的历史数据</li>
</ol><p>如果我们不设置Cookie过期时间，那么这个Cookie将不存放在硬盘上，当浏览器关闭的时候，Cookie就会消失。如果我们设置过期时间为若干天之后，那么这个Cookie会保存在客户端硬盘中，即使浏览器关闭，这个值仍然存在。</p></section><section><h3>Session, Cookie, Token的联系和区别？<a href="#session-cookie-token的联系和区别"><span>#</span></a></h3><p>Session是存放在服务器端的，用来存储用户信息的结构。最常见的Session ID保存方式是使用Cookie。</p><ul>
<li>当浏览器第一次发送请求时，服务器自动生成了一个Session和一个Session ID用来唯一标识这个Session，并将其通过响应发送到浏览器</li>
<li>当浏览器第二次发送请求，会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上，服务器从请求中提取出Session ID，并和保存的所有Session ID进行对比，找到这个用户对应的Session</li>
</ul><p>Cookie往往可以与Session结合使用：</p><ol>
<li>客户端会发送一个HTTP请求到服务器端</li>
<li>服务器端接受客户端请求后，建立一个Session，并发送一个HTTP响应到客户端，这个响应头，其中就包含Set-Cookie头部。该头部包含了Session ID</li>
<li>在客户端发起的第二次请求，假如服务器给了set-Cookie，浏览器会自动在请求头中添加cookie</li>
<li>服务器接收请求，分解cookie，验证信息，核对成功后返回response给客户端</li>
</ol><hr /><p>Token也称作令牌，类似于临时的证书签名, 一种服务端无状态(服务端并不会保存身份认证相关的数据)的认证方式, 非常适合于REST API的场景</p><p>Token的组成:</p><ul>
<li>uid: 用户唯一身份标识</li>
<li>time: 当前时间的时间戳</li>
<li>sign: 签名, 使用hash/encrypt压缩成定长的十六进制字符串，以防止第三方恶意拼接</li>
<li>固定参数(可选): 将一些常用的固定参数加入到Token中是为了避免重复查库</li>
</ul><p>Token的使用流程：</p><ol>
<li>用户登录，成功后服务器返回Token给客户端。</li>
<li>客户端收到数据后保存在客户端</li>
<li>客户端再次访问服务器，将Token放入headers中</li>
<li>服务器端过滤校验。校验成功则返回请求数据，校验失败则返回错误码</li>
</ol></section></section><section><h2>DNS<a href="#dns"><span>#</span></a></h2><section><h3>简介<a href="#简介-4"><span>#</span></a></h3><p>DNS指域名系统(Domain Name System)。主要作用是根据域名查出IP地址，有了IP地址才能进行网络通信。</p></section><section><h3>查询方式<a href="#查询方式"><span>#</span></a></h3><p>DNS查询主要有纯递归查询和递归+迭代查询两种方式：</p><p></p><figure><img src="/blog-assets/images/ComputerNetwork/DNS-query.png" alt="DNS-query.png" /><figcaption>DNS-query.png</figcaption></figure><p></p><p>递归和迭代的比较：</p><ul>
<li>递归：客户端只发一次请求，要求对方给出最终结果。</li>
<li>迭代：客户端发出一次请求，对方如果没有授权回答，它就会返回一个能解答这个查询的其它名称服务器列表，客户端会再向返回的列表中发出请求，直到找到最终负责所查域名的名称服务器，从它得到最终结果。</li>
</ul><p>因为纯递归查询比较耗时，因此现在使用比较少。而对于递归+迭代查询，主要流程如下：</p><ol>
<li>主机(地址为x.abc.com)要查询y.def.com的IP地址</li>
<li>主机在本地DNS服务器(dns.abc.com)上查询y.def.com的地址。这个本地DNS服务器一般指电脑上网时IPv4或IPv6设置中填写的DNS地址，可能是手动指定或DHCP自动分配的。一般电脑直连运营商网络的话，本地DNS就是DHCP分配到的运营商的服务器地址</li>
<li>本地DNS检查缓存是否有y.def.com的记录，如果没有，就直接询问DNS根服务器。DNS根服务器能指出y.def.com具体由哪一个顶级区域管理(.com)，并返回这个顶级域服务器的地址</li>
<li>主机向顶级域服务器发起查询y.def.com的请求，顶级域服务器能返回二级域名服务器的地址(def.com)</li>
<li>主机向二级域名服务器发起请求，查询y.def.com的IP地址，得到最终的IP地址结果。主机把这个IP地址写入DNS缓存，以备之后再次查询。</li>
</ol></section></section><section><h2>电子邮件相关协议<a href="#电子邮件相关协议"><span>#</span></a></h2><p>简单而言，Alice给Bob发送一封邮件的流程是：</p><ol>
<li>Alice的代理，经过SMTP协议，把邮件传输到Alice的邮件服务器上</li>
<li>Alice的邮件服务器，经过SMTP协议，把邮件传输到Bob的邮件服务器上</li>
<li>Bob的邮件服务器，经过POP3、IMAP或HTTP协议，把邮件传输到Bob的代理上</li>
</ol><section><h3>SMTP<a href="#smtp"><span>#</span></a></h3><p>Simple Mail Transfer Protocol（简单邮件传输协议），建立在FTP协议上，用来将邮件从发送方的邮件服务器传输到接收方的邮件服务器，或者是从发送方代理到发送方的邮件服务器。</p></section><section><h3>POP3<a href="#pop3"><span>#</span></a></h3><p>Post Office Protocol - Version 3（邮局协议版本3），将邮件从接收方的邮件服务器传输到接收方的用户代理。</p></section><section><h3>IMAP<a href="#imap"><span>#</span></a></h3><p>Internet Mail Access Protocol（因特网邮件访问协议），与POP3的基础职责相同，但是提供了比POP3更丰富的功能，例如POP3只允许邮件客户端下载服务器上的邮件，但客户端的操作（删除/移动/标记已读等）不会反映到服务器上；而IMAP提供了服务器与客户端之间的双向通信。</p></section></section><section><h2>DHCP<a href="#dhcp"><span>#</span></a></h2><section><h3>简介与优点<a href="#简介与优点"><span>#</span></a></h3><p>DHCP(Dynamic Host Configuration Protocol，动态主机配置协议)，常用于中、大型网络中由服务器给每一台网络中与之连接的客户机自动分配IP地址。DHCP基于UDP协议。</p><p>优点：</p><ul>
<li>网络管理员可以验证IP地址和其它配置参数，而不用去人工检查每台主机</li>
<li>DHCP可以约束特定计算机使用特定IP地址，并且不会同时租借相同的IP地址给两台主机，避免冲突</li>
<li>客户机在不同子网间移动时不需要重新设置IP地址</li>
</ul></section><section><h3>分配IP地址的流程<a href="#分配ip地址的流程"><span>#</span></a></h3><ol>
<li>DHCPDISCOVER：客户端在子网上广播一个DHCPDISCOVER数据包，以此来寻找合适的DHCP服务器。它表示客户端与服务器之间的DHCP交互开始</li>
<li>DHCPOFFER：每个收到DHCPDISCOVER包的DHCP服务器都会预留一个IP地址，并向客户机发送这个DHCPOFFER包。数据包中包含了IP地址以及网络配置设置</li>
<li>DHCPREQUEST：客户端可能会收到来自多个服务器的DHCPOFFER包，但它只接受其中一个DHCPOFFER包中包含的IP地址，并广播一个DHCPREQUEST包进行回复。DHCPREQUEST包不仅对被接受的DHCP服务器进行应答，还通知其他DHCP服务器它们的offer被拒绝</li>
<li>DHCPACK：被接受的DHCP服务器收到DHCPREQUEST数据包后，回复一个DHCPACK数据包。这是DHCP服务器的确认，授权客户机使用之前DHCPOFFER包中的网络配置。至此，客户端成功获得了一个IP地址</li>
</ol></section></section><section><h2>BGP<a href="#bgp"><span>#</span></a></h2><section><h3>简介<a href="#简介-5"><span>#</span></a></h3><p>边界网关协议（Border Gateway Protocol, BGP）是互联网上一个核心的去中心化自治路由协议。先看几个相关概念：</p><ul>
<li>AS（Autonomous system）：自治系统，指在一个（有时是多个）组织管辖下的所有IP网络和路由器的全体，它们对互联网执行共同的路由策略。对于互联网来说，一个AS是一个独立的整体网络。而BGP实现的网络自治也是指各个AS自治。每个AS有自己唯一的编号ASN。</li>
<li>IGP（Interior Gateway Protocol）：内部网关协议，在一个AS内部所使用的一种路由协议。一个AS内部也可以有多个路由器管理多个网络。各个路由器之间需要路由信息以知道子网络的可达信息。IGP就是用来管理这些路由。代表的实现有RIP和OSPF。</li>
<li>EGP（Exterior Gateway Protocol）：外部网关协议，在多个AS之间使用的一种路由协议，现在已经被BGP取而代之。</li>
</ul><p>由于BGP就是为了替换EGP而创建，它的地位与EGP相似。但是BGP也可以应用在一个AS内部。因此BGP又可以分为IBGP（Interior BGP ：同一个AS之间的连接）和EBGP（Exterior BGP：不同AS之间的BGP连接）。</p><p>既然EGP已经被替代了，那EBGP的存在比较好理解；但是IGP协议都还活得好好的（这里主要指OSPF等协议），那IBGP的意义何在？IGP的协议是针对同一个AS网络来设计的，一个自治网络的规模一般都不大，所以设计的时候就没有考虑大规模网络的情况。而当一个自治网络足够大时，OSPF存在性能瓶颈。此时，只有BGP的设计能满足大型网络的要求，所以大型私有IP网络内部可以使用IBGP。总的来说，这几类路由协议，小规模私有网络IGP，大规模私有网络IBGP，互联网EBGP。</p></section><section><h3>工作原理<a href="#工作原理-1"><span>#</span></a></h3><p>BGP路由是基于AS路径(AS Path)来完成的。AS路径是到达一条路由的ASN列表。来自不同AS的两个路由器之间有一条路径，这条路径可能会穿越若干AS。AS路径包括了这条路由路径上需要穿越的所有AS。</p><p>BGP路由存储在BGP路由器的数据库中，每条BGP路由都包含了目的地AS，下一跳和完整的AS Path。当BGP路由器收到了一条路由信息，检查路径发现包含了自己的AS号，那它就能判定这是一条自己曾经发出的路由信息，收到的这条路由信息会被丢弃；反之，将其发送给下一跳AS。</p><p>BGP基于路径矢量，举个例子，如果BGP路由器收到两条路由信息，目的网络一样，但是路径不一样，一个是AS1-&gt;AS3-&gt;AS2，另一个是AS1-&gt;AS2，如果没有其他的特殊策略，BGP路由器会选用AS1-&gt;AS2这条路由信息。</p></section><section><h3>优点<a href="#优点"><span>#</span></a></h3><ul>
<li>灵活，可以跨越多跳路由器建立邻居关系，并在路由中携带丰富的属性，适应不同场景的需求</li>
<li>高效，丰富的路由策略能够使得不同场景下都能快速传递路由信息</li>
<li>稳定，避免路由环路，保证能将数据包传到目的地</li>
</ul></section></section></section>
<section><h1>无线网（802.11）<a href="#无线网80211"><span>#</span></a></h1><section><h3>无线网通信使用CSMA/CA的原因<a href="#无线网通信使用csmaca的原因"><span>#</span></a></h3><ul>
<li>无线信道中信号强度动态范围很大，适配器接受的信号强度远远小于发送信号的强度，如果要在无线网的适配器上实现碰撞检测功能，硬件成本会非常大。</li>
<li>无线电波能向所有方向传播，由于各种障碍物的存在，电磁波传播距离受限，这导致碰撞检测很可能出现错误：检测到信道空闲，其实并不空闲（隐藏站问题）；而检测到信道忙，其实并不忙（暴露站问题）。</li>
</ul></section></section>
<section><h1>在浏览器输入URL回车之后发生了什么<a href="#在浏览器输入url回车之后发生了什么"><span>#</span></a></h1><ol>
<li>
<p>浏览器层面的操作</p>
<ul>
<li>URL解析：首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词，并且根据你输入的内容进行自动完成、字符编码等操作。</li>
<li>安全检查：访问限制，是否强制使用HTTPS，…</li>
<li>检查缓存是否过期</li>
</ul>
</li>
<li>
<p>DNS查询域名对应的IP地址
浏览器缓存 -&gt; 操作系统缓存 -&gt; 路由器缓存 -&gt; ISP缓存 -&gt; 根域名服务器（递归+迭代）</p>
</li>
<li>
<p>依照TCP/IP协议传输
TCP/IP分为四层，在发送数据时，每层都要对数据进行封装。</p>
<p>每一层的甄别标准：</p>
<ul>
<li>应用层：根据TCP/UDP的端口号甄别</li>
<li>传输层：根据TCP/UDP头部甄别</li>
<li>网络层：根据IP头部16位字段甄别</li>
<li>链路层：根据以太网帧头部的2字节的类型字段甄别</li>
</ul>
<p>每一层的构造:</p>
<ul>
<li>应用层：浏览器会开始构造一个HTTP报文</li>
<li>传输层：发起一条到达服务器的TCP连接，为了方便传输，会对数据进行分割（以报文段为单位），并标记编号，方便服务器接受时能够准确地还原报文信息。</li>
<li>网络层：IP协议查询MAC地址，将数据段打包，并加入源及目标的IP地址，并且负责寻找传输路线。判断目标地址是否与当前地址处于同一网络中，是的话直接根据MAC地址发送，否则使用路由表查找下一跳地址，以及使用 ARP 协议查询它的MAC地址。</li>
<li>链路层：根据以太网协议将数据分为以“帧”为单位的数据包，每一帧分为两个包含头部(数据包的发送者、接受者、数据类型)和数据段</li>
</ul>
<p></p><figure><img src="/blog-assets/images/ComputerNetwork/TCP-transmission.png" alt="TCP-transmission.png" /><figcaption>TCP-transmission.png</figcaption></figure><p></p>
</li>
<li>
<p>服务器响应</p>
<ul>
<li>接受TCP报文后，会对连接进行处理，对HTTP协议进行解析（请求方法、域名、路径等）</li>
<li>看是否需要重定向，如果服务器配置了HTTP重定向，就会返回一个301永久重定向响应，浏览器就会根据响应，重新发送HTTP请求，重复以上流程</li>
<li>查看URL重写规则，如果请求的文件是真实存在的，会直接把这个文件返回；否则服务器会按照规则把请求重写到另一个REST风格的URL上。</li>
</ul>
</li>
<li>
<p>浏览器接受响应</p>
<ul>
<li>查看Response header，根据不同状态码做不同的事（比如上面提到的重定向）</li>
<li>如果响应资源进行了压缩（比如 gzip），还需要进行解压</li>
<li>对响应资源做缓存</li>
<li>根据响应资源里的MIME类型去解析响应内容（比如 HTML、Image各有不同的解析方式）</li>
</ul>
</li>
<li>
<p>渲染页面
HTML解析，CSS解析，JavaScript的执行</p>
</li>
</ol></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2021-01-01-%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/</id>
      <title type="text">排序算法</title>
      <published>2021-01-01T00:00:00.000Z</published>
      <updated>2021-01-01T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2021-01-01-%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/"/>
      <summary type="text">常用的排序算法</summary>
      <content type="html"><![CDATA[<p>常用的排序算法</p>

<section><h2>算法一览<a href="#算法一览"><span>#</span></a></h2><p></p><figure><img src="/blog-assets/images/Algorithms/sort-table.png" alt="sort-table.png" /><figcaption>sort-table.png</figcaption></figure><p></p></section>
<section><h2>冒泡排序<a href="#冒泡排序"><span>#</span></a></h2><p>比较相邻的元素。如果第一个比第二个大，就交换他们两个。对每一对相邻元素作同样的工作，从开始第一对到结尾的最后一对。这步做完后，最后的元素会是最大的数。</p><p>优化思路：立一个flag，当在一趟序列遍历中元素没有发生交换，则证明该序列已经有序。</p><p></p><figure><img src="/blog-assets/images/Algorithms/bubbleSort.gif" alt="bubbleSort.gif" /><figcaption>bubbleSort.gif</figcaption></figure><p></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>int</span><span>[] </span><span>bubbleSort</span><span>(</span><span>int</span><span>[] arr) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>for</span><span> (</span><span>int</span><span> i </span><span><span>=</span><span> </span></span><span>1</span><span><span>;</span><span> i </span><span>&lt;</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span><span>;</span><span> i</span><span>++</span><span>) {</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// 设定一个标记，若为true，则表示此次循环没有进行交换，也就是待排序列已经有序，排序已经完成。</span></div></div><div><div><div>4</div></div><div><span>        </span><span>boolean</span><span> flag </span><span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span> j </span><span><span>=</span><span> </span></span><span>0</span><span><span>;</span><span> j </span><span>&lt;</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> i</span><span>;</span><span> j</span><span>++</span><span>) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span><span> (arr[j] </span><span>&gt;</span><span> arr[j </span><span>+</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>8</div></div><div><span>                </span><span>int</span><span> tmp </span><span><span>=</span><span> arr[j]</span><span>;</span></span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>arr[j] </span><span>=</span><span> arr[j </span><span>+</span><span> </span><span>1</span><span><span>]</span><span>;</span></span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>arr[j </span><span>+</span><span> </span><span>1</span><span><span>] </span><span>=</span><span> tmp</span><span>;</span></span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>flag </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span> (flag) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>break</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>    </span><span>return</span><span><span> arr</span><span>;</span></span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>选择排序<a href="#选择排序"><span>#</span></a></h2><p>首先在未排序序列中找到最小（大）元素，存放到排序序列的起始位置。再从剩余未排序元素中继续寻找最小（大）元素，然后放到已排序序列的末尾。重复第二步，直到所有元素均排序完毕。</p><p></p><figure><img src="/blog-assets/images/Algorithms/selectionSort.gif" alt="selectionSort.gif" /><figcaption>selectionSort.gif</figcaption></figure><p></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>int</span><span>[] </span><span>selectionSort</span><span>(</span><span>int</span><span>[] arr) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>// 总共要经过 N-1 轮比较</span></div></div><div><div><div>3</div></div><div><span>    </span><span>for</span><span> (</span><span>int</span><span> i </span><span><span>=</span><span> </span></span><span>0</span><span><span>;</span><span> i </span><span>&lt;</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span>;</span><span> i</span><span>++</span><span>) {</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span> minIndex </span><span><span>=</span><span> i</span><span>;</span></span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// 每轮需要比较的次数 N-i</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span> j </span><span><span>=</span><span> i </span><span>+</span><span> </span></span><span>1</span><span><span>;</span><span> j </span><span>&lt;</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span><span>;</span><span> j</span><span>++</span><span>)</span></span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (arr[j] </span><span>&lt;</span><span> arr[minIndex]) {</span></span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>minIndex </span><span>=</span><span> j</span><span>;</span><span> </span><span>// 记录目前能找到的最小值元素的下标</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// 将找到的最小下标和i进行交换</span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (i </span><span>!=</span><span> minIndex) {</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>int</span><span> tmp </span><span><span>=</span><span> arr[i]</span><span>;</span></span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>arr[i] </span><span>=</span><span> arr[minIndex]</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>arr[minIndex] </span><span>=</span><span> tmp</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>    </span><span>return</span><span><span> arr</span><span>;</span></span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>插入排序<a href="#插入排序"><span>#</span></a></h2><p>将第一待排序序列第一个元素看做一个有序序列，把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列，将扫描到的每个元素插入有序序列的适当位置。（如果待插入的元素与有序序列中的某个元素相等，则将待插入元素插入到相等元素的后面。）（联想打扑克时整理手牌）</p><p>优化思路：希尔排序</p><p></p><figure><img src="/blog-assets/images/Algorithms/insertionSort.gif" alt="insertionSort.gif" /><figcaption>insertionSort.gif</figcaption></figure><p></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>int</span><span>[] </span><span>insertionSort</span><span>(</span><span>int</span><span>[] arr) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>// 从下标为1的元素开始选择合适的位置插入，因为下标为0的只有一个元素，默认是有序的</span></div></div><div><div><div>3</div></div><div><span>    </span><span>for</span><span> (</span><span>int</span><span> i </span><span><span>=</span><span> </span></span><span>1</span><span><span>;</span><span> i </span><span>&lt;</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span><span>;</span><span> i</span><span>++</span><span>) {</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// 当前要插入的数据</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span> tmp </span><span><span>=</span><span> arr[i]</span><span>;</span></span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// 从已经排序的序列最右边的开始比较，如果找到比其小的数，把这个数右移一位，腾位置给要插入的数</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span> j </span><span><span>=</span><span> i</span><span>;</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>while</span><span><span> (j </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> tmp </span><span>&lt;</span><span> arr[j </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>arr[j] </span><span>=</span><span> arr[j </span><span>-</span><span> </span><span>1</span><span><span>]</span><span>;</span></span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>j</span><span>--;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// 存在比其小的数，插入</span></div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span><span> (j </span><span>!=</span><span> i) {</span></span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>arr[j] </span><span>=</span><span> tmp</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>    </span><span>return</span><span><span> arr</span><span>;</span></span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>希尔排序<a href="#希尔排序"><span>#</span></a></h2><p>把记录按下标的一定增量（gap）分组，对每组使用直接插入排序算法排序；随着增量逐渐减少，每组包含的关键词越来越多，当增量减至1时，整个文件恰被分成一组，算法便终止。</p><p>希尔排序的gap选择与证明是个数学难题，希尔建议的gap是数组长度的一半。</p><p></p><figure><img src="/blog-assets/images/Algorithms/shellSort.gif" alt="shellSort.gif" /><figcaption>shellSort.gif</figcaption></figure><p></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>int</span><span>[] </span><span>shellSort</span><span>(</span><span>int</span><span>[] arr) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>// 初始gap的选择</span></div></div><div><div><div>3</div></div><div><span>    </span><span>int</span><span> gap </span><span><span>=</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span><span> </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>while</span><span><span> (gap </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>        </span><span>// 从下标为gap的元素开始选择合适的位置插入，因为下标为0的只有一个元素，默认是有序的</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span> i </span><span><span>=</span><span> gap</span><span>;</span><span> i </span><span>&lt;</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span><span>;</span><span> i</span><span>++</span><span>) {</span></span></div></div><div><div><div>8</div></div><div><span>            </span><span>// 当前要插入的数据</span></div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span> tmp </span><span><span>=</span><span> arr[i]</span><span>;</span></span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>            </span><span>// 从已经排序的序列最右边的开始比较，如果找到比其小的数，把这个数右移gap位，腾位置给要插入的数</span></div></div><div><div><div>12</div></div><div><span>            </span><span>int</span><span> j </span><span><span>=</span><span> i </span><span>-</span><span> gap</span><span>;</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>while</span><span><span> (j </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> tmp </span><span>&lt;</span><span> arr[j]) {</span></span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>arr[j </span><span>+</span><span> gap] </span><span>=</span><span> arr[j]</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>j </span><span>-=</span><span> gap</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>arr[j </span><span>+</span><span> gap] </span><span>=</span><span> tmp</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>gap </span><span>=</span><span> gap </span><span>/</span><span> </span><span>2</span><span><span>;</span><span> </span></span><span>// gap缩小</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>    </span><span>return</span><span><span> arr</span><span>;</span></span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>归并排序<a href="#归并排序"><span>#</span></a></h2><p>申请空间，使其大小为两个已经排序序列之和，该空间用来存放合并后的序列。设定两个指针分别指向两个已经排序序列的起始位置，不断比较两个指针所指向的元素，选择相对小的元素放入到合并空间，并移动指针到下一位置。如果一个序列到达末尾，再把另一个序列的剩余元素添加到合并序列的末尾。</p><p></p><figure><img src="/blog-assets/images/Algorithms/mergeSort.gif" alt="mergeSort.gif" /><figcaption>mergeSort.gif</figcaption></figure><p></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>void</span><span> </span><span>mergeSort</span><span>(</span><span>int</span><span><span>[] result</span><span>,</span><span> </span></span><span>int</span><span><span>[] data</span><span>,</span><span> </span></span><span>int</span><span><span> left</span><span>,</span><span> </span></span><span>int</span><span> right) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>if</span><span><span> (left </span><span>&gt;=</span><span> right) {</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>int</span><span> mid </span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>// 双指针，确定两个子数组的起始下标</span></div></div><div><div><div>9</div></div><div><span>    </span><span>int</span><span> ptr1 </span><span><span>=</span><span> left</span><span>;</span></span></div></div><div><div><div>10</div></div><div><span>    </span><span>int</span><span> ptr2 </span><span><span>=</span><span> mid </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span>// 分治</span></div></div><div><div><div>13</div></div><div><span>    </span><span>mergeSort</span><span><span>(result</span><span>,</span><span> data</span><span>,</span><span> left</span><span>,</span><span> mid)</span><span>;</span></span></div></div><div><div><div>14</div></div><div><span>    </span><span>mergeSort</span><span><span>(result</span><span>,</span><span> data</span><span>,</span><span> mid</span><span>+</span></span><span>1</span><span><span>,</span><span> right)</span><span>;</span></span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span>// 按照双指针进行排序</span></div></div><div><div><div>17</div></div><div><span>    </span><span>int</span><span> index </span><span><span>=</span><span> left</span><span>;</span></span></div></div><div><div><div>18</div></div><div><span>    </span><span>while</span><span><span> (ptr1 </span><span>&lt;=</span><span> mid </span><span>&amp;&amp;</span><span> ptr2 </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>result[index</span><span>++</span><span>] </span><span>=</span><span> data[ptr1] </span><span>&lt;</span><span> data[ptr2] </span><span>?</span><span><span> data[ptr1</span><span>++</span><span>] </span></span><span>:</span><span><span> data[ptr2</span><span>++</span><span>]</span><span>;</span></span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>// 两个循环只会执行一个，即：拷贝那个有剩余的数组</span></div></div><div><div><div>24</div></div><div><span>    </span><span>while</span><span><span> (ptr1 </span><span>&lt;=</span><span> mid) {</span></span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>result[index</span><span>++</span><span>] </span><span>=</span><span> data[ptr1</span><span>++</span><span>]</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>    </span><span>while</span><span><span> (ptr2 </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>result[index</span><span>++</span><span>] </span><span>=</span><span> data[ptr2</span><span>++</span><span>]</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>    </span><span>// 把排好序的结果覆盖掉原始的数组</span></div></div><div><div><div>32</div></div><div><span>    </span><span>for</span><span><span> (index </span><span>=</span><span> left</span><span>;</span><span> index </span><span>&lt;=</span><span> right</span><span>;</span><span> index</span><span>++</span><span>) {</span></span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>data[index] </span><span>=</span><span> result[index]</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>快速排序<a href="#快速排序"><span>#</span></a></h2><p>从数列中挑出一个元素，称为 “基准”（pivot）。重新排序数列，所有元素比基准值小的摆放在基准前面，所有元素比基准值大的摆在基准的后面（相同的数放到任意一边），这个步骤称为称为分区（partition）操作。递归地把小于基准值元素的子数列和大于基准值元素的子数列都进行排序。</p><p></p><figure><img src="/blog-assets/images/Algorithms/quickSort.gif" alt="quickSort.gif" /><figcaption>quickSort.gif</figcaption></figure><p></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>int</span><span> </span><span>partition</span><span>(</span><span>int</span><span><span>[] data</span><span>,</span><span> </span></span><span>int</span><span><span> left</span><span>,</span><span> </span></span><span>int</span><span> right) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>int</span><span> pivot </span><span><span>=</span><span> data[left]</span><span>;</span><span> </span></span><span>// 初始pivot</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>// 范围内搜寻比pivot小或大的元素，然后将左侧元素与右侧元素交换</span></div></div><div><div><div>5</div></div><div><span>    </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>while</span><span><span> (data[right] </span><span>&gt;=</span><span> pivot </span><span>&amp;&amp;</span><span> left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>right</span><span>--;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>data[left] </span><span>=</span><span> data[right]</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>while</span><span><span> (data[left] </span><span>&lt;=</span><span> pivot </span><span>&amp;&amp;</span><span> left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>left</span><span>++;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>data[right] </span><span>=</span><span> data[left]</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>data[left] </span><span>=</span><span> pivot</span><span>;</span></div></div><div><div><div>18</div></div><div><span>    </span><span>return</span><span><span> left</span><span>;</span></span></div></div><div><div><div>19</div></div><div><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>public</span><span> </span><span>void</span><span> </span><span>quickSort</span><span>(</span><span>int</span><span><span>[] data</span><span>,</span><span> </span></span><span>int</span><span><span> begin</span><span>,</span><span> </span></span><span>int</span><span> end) {</span></div></div><div><div><div>22</div></div><div><span>    </span><span>if</span><span><span> (begin </span><span>&gt;=</span><span> end) {</span></span></div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>int</span><span> pivot </span><span><span>=</span><span> </span></span><span>partition</span><span><span>(data</span><span>,</span><span> begin</span><span>,</span><span> end)</span><span>;</span></span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>    </span><span>// 两个子数组分治排序</span></div></div><div><div><div>29</div></div><div><span>    </span><span>quickSort</span><span><span>(data</span><span>,</span><span> begin</span><span>,</span><span> pivot </span><span>-</span><span> </span></span><span>1</span><span><span>)</span><span>;</span></span></div></div><div><div><div>30</div></div><div><span>    </span><span>quickSort</span><span><span>(data</span><span>,</span><span> pivot </span><span>+</span><span> </span></span><span>1</span><span><span>,</span><span> end)</span><span>;</span></span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>堆排序<a href="#堆排序"><span>#</span></a></h2><p>创建一个堆 <code>H[0……n-1]</code>，把堆首（最大值）和堆尾互换；把堆的尺寸缩小1，把新的数组顶端数据调整到相应位置；重复步骤2，直到堆的尺寸为1。</p><p></p><figure><img src="/blog-assets/images/Algorithms/heapSort.gif" alt="heapSort.gif" /><figcaption>heapSort.gif</figcaption></figure><p></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>int</span><span>[] </span><span>heapSort</span><span>(</span><span>int</span><span>[] arr) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>int</span><span> len </span><span><span>=</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>// 构造堆</span></div></div><div><div><div>5</div></div><div><span>    </span><span>for</span><span> (</span><span>int</span><span> i </span><span><span>=</span><span> len </span><span>/</span><span> </span></span><span>2</span><span><span>;</span><span> i </span><span>&gt;=</span><span> </span></span><span>0</span><span><span>;</span><span> i</span><span>--</span><span>) {</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>heapify</span><span><span>(arr</span><span>,</span><span> i</span><span>,</span><span> len)</span><span>;</span></span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>for</span><span> (</span><span>int</span><span> i </span><span><span>=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span><span>;</span><span> i </span><span>&gt;</span><span> </span></span><span>0</span><span><span>;</span><span> i</span><span>--</span><span>) {</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>swap</span><span><span>(arr</span><span>,</span><span> </span></span><span>0</span><span><span>,</span><span> i)</span><span>;</span><span> </span></span><span>// 把堆顶最大值和堆尾互换</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>len</span><span>--;</span><span> </span><span>// 堆的尺寸减少1</span></div></div><div><div><div>12</div></div><div><span>        </span><span>heapify</span><span><span>(arr</span><span>,</span><span> </span></span><span>0</span><span><span>,</span><span> len)</span><span>;</span><span> </span></span><span>// 新的堆顶调整到相应位置</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>return</span><span><span> arr</span><span>;</span></span></div></div><div><div><div>16</div></div><div><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>private</span><span> </span><span>void</span><span> </span><span>heapify</span><span>(</span><span>int</span><span><span>[] arr</span><span>,</span><span> </span></span><span>int</span><span><span> i</span><span>,</span><span> </span></span><span>int</span><span> len) {</span></div></div><div><div><div>19</div></div><div><span>    </span><span>int</span><span> left </span><span><span>=</span><span> </span></span><span>2</span><span><span>*</span><span>i </span><span>+</span><span> </span></span><span>1</span><span><span>,</span><span> right </span><span>=</span><span> </span></span><span>2</span><span><span>*</span><span>i </span><span>+</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span>// 判断两个儿子是否比当前节点大，如果有，返回最大的那个</span></div></div><div><div><div>22</div></div><div><span>    </span><span>int</span><span> max </span><span><span>=</span><span> i</span><span>;</span></span></div></div><div><div><div>23</div></div><div><span>    </span><span>if</span><span><span> (left </span><span>&lt;</span><span> len </span><span>&amp;&amp;</span><span> arr[left] </span><span>&gt;</span><span> arr[max]) {</span></span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>max </span><span>=</span><span> left</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>    </span><span>if</span><span><span> (right </span><span>&lt;</span><span> len </span><span>&amp;&amp;</span><span> arr[right] </span><span>&gt;</span><span> arr[max]) {</span></span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>max </span><span>=</span><span> right</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>    </span><span>if</span><span><span> (max </span><span>!=</span><span> i) {</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>swap</span><span><span>(arr</span><span>,</span><span> i</span><span>,</span><span> max)</span><span>;</span><span> </span></span><span>// 交换父子</span></div></div><div><div><div>32</div></div><div><span>        </span><span>heapify</span><span><span>(arr</span><span>,</span><span> max</span><span>,</span><span> len)</span><span>;</span><span> </span></span><span>// 调整当前最大节点到堆尾</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>private</span><span> </span><span>void</span><span> </span><span>swap</span><span>(</span><span>int</span><span><span>[] arr</span><span>,</span><span> </span></span><span>int</span><span><span> i</span><span>,</span><span> </span></span><span>int</span><span> j) {</span></div></div><div><div><div>37</div></div><div><span>    </span><span>int</span><span> temp </span><span><span>=</span><span> arr[i]</span><span>;</span></span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>arr[i] </span><span>=</span><span> arr[j]</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>arr[j] </span><span>=</span><span> temp</span><span>;</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>计数排序<a href="#计数排序"><span>#</span></a></h2><p>计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组C中。找出待排序的数组中最大和最小的元素，统计数组中每个值为i的元素出现的次数，存入数组C的第i项。对所有的计数累加（从C中的第一个元素开始，每一项和前一项相加），将每个元素i放在新数组的第C(i)项，每放一个元素就将C(i)减去1。</p><p></p><figure><img src="/blog-assets/images/Algorithms/countingSort.gif" alt="countingSort.gif" /><figcaption>countingSort.gif</figcaption></figure><p></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>private</span><span> </span><span>int</span><span> </span><span>getMinValue</span><span>(</span><span>int</span><span>[] arr) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>int</span><span> minValue </span><span><span>=</span><span> arr[</span></span><span>0</span><span><span>]</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>for</span><span> (</span><span>int</span><span> value </span><span>:</span><span> arr) {</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (minValue </span><span>&gt;</span><span> value) {</span></span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>minValue </span><span>=</span><span> value</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>return</span><span><span> minValue</span><span>;</span></span></div></div><div><div><div>10</div></div><div><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>private</span><span> </span><span>int</span><span> </span><span>getMaxValue</span><span>(</span><span>int</span><span>[] arr) {</span></div></div><div><div><div>13</div></div><div><span>    </span><span>int</span><span> maxValue </span><span><span>=</span><span> arr[</span></span><span>0</span><span><span>]</span><span>;</span></span></div></div><div><div><div>14</div></div><div><span>    </span><span>for</span><span> (</span><span>int</span><span> value </span><span>:</span><span> arr) {</span></div></div><div><div><div>15</div></div><div><span>        </span><span>if</span><span><span> (maxValue </span><span>&lt;</span><span> value) {</span></span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>maxValue </span><span>=</span><span> value</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span>return</span><span><span> maxValue</span><span>;</span></span></div></div><div><div><div>21</div></div><div><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>private</span><span> </span><span>int</span><span>[] </span><span>countingSort</span><span>(</span><span>int</span><span><span>[] arr</span><span>,</span><span> </span></span><span>int</span><span><span> minValue</span><span>,</span><span> </span></span><span>int</span><span> maxValue) {</span></div></div><div><div><div>24</div></div><div><span>    </span><span>// 桶的长度</span></div></div><div><div><div>25</div></div><div><span>    </span><span>int</span><span> bucketLen </span><span><span>=</span><span> maxValue </span><span>-</span><span> minValue </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>26</div></div><div><span>    </span><span>int</span><span>[] temp </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[bucketLen]</span><span>;</span></span></div></div><div><div><div>27</div></div><div><span>    </span><span>// 每个值映射后出现的次数</span></div></div><div><div><div>28</div></div><div><span>    </span><span>for</span><span> (</span><span>int</span><span> value </span><span>:</span><span><span> arr) temp[value </span><span>-</span><span> minValue]</span><span>++;</span></span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>    </span><span>int</span><span> sortedIndex </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>31</div></div><div><span>    </span><span>for</span><span> (</span><span>int</span><span> j </span><span><span>=</span><span> </span></span><span>0</span><span><span>;</span><span> j </span><span>&lt;</span><span> bucketLen</span><span>;</span><span> j</span><span>++</span><span>) {</span></span></div></div><div><div><div>32</div></div><div><span>        </span><span>while</span><span><span> (temp[j] </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>arr[sortedIndex</span><span>++</span><span>] </span><span>=</span><span> j </span><span>+</span><span> minValue</span><span>;</span><span> </span><span>// 把桶中的数取出放到数组末尾</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>temp[j]</span><span>--;</span><span> </span><span>// 用掉了一次当前数，桶中的次数减少</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>    </span><span>return</span><span><span> arr</span><span>;</span></span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2021-01-01-%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/</id>
      <title type="text">系统设计</title>
      <published>2021-01-01T00:00:00.000Z</published>
      <updated>2021-01-01T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2021-01-01-%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/"/>
      <summary type="text">系统设计入门概念普及。</summary>
      <content type="html"><![CDATA[<p>系统设计入门概念普及。</p>

<section><h1>高质量设计目标<a href="#高质量设计目标"><span>#</span></a></h1><section><h2>性能<a href="#性能"><span>#</span></a></h2><section><h3>性能指标<a href="#性能指标"><span>#</span></a></h3><ul>
<li>响应时间：指某个请求从发出到接收到响应消耗的时间。在对响应时间进行测试时，通常采用重复请求的方式，然后计算平均响应时间</li>
<li>吞吐量（TPS）：指系统在单位时间内可以处理的请求数量，通常使用每秒的请求数来衡量</li>
<li>并发用户数：指系统能同时处理的并发用户请求数量
<ul>
<li>在没有并发存在的系统中，请求被顺序执行</li>
<li>目前的大型系统都支持多线程来处理并发请求，多线程能够提高吞吐量以及缩短响应时间，主要是由于多CPU的引入以及IO多路复用提高效率</li>
</ul>
</li>
</ul></section><section><h3>性能优化<a href="#性能优化"><span>#</span></a></h3><ul>
<li>集群：将多台服务器组成集群，使用负载均衡将请求转发到集群中，避免单一服务器的负载压力过大导致性能降低。</li>
<li>缓存：提高性能
<ul>
<li>数据通常位于内存等介质中，这种介质对于读操作特别快</li>
<li>数据可以位于靠近用户的地理位置上</li>
<li>可以将计算结果进行缓存，从而避免重复计算</li>
</ul>
</li>
<li>异步：某些流程可以将操作转换为消息，将消息发送到消息队列之后立即返回，之后这个操作会被异步处理</li>
</ul></section></section><section><h2>服务化<a href="#服务化"><span>#</span></a></h2><p>按照“自包含、可重用、独立管理”三原则，将网络功能定义为若干个可被灵活调用的“服务”模块。</p><p>优点：</p><ul>
<li>敏捷：服务松耦合，网络部署、维护、升级更快速、便利</li>
<li>易扩展：轻量级的接口使得新功能的引入不需要引入新的接口设计</li>
<li>灵活：通过模块化、可重用方式实现网络功能的组合，满足网络切片等灵活组网需求</li>
<li>开放：新型REST API接口极大的便于运营商或第三方调用服务</li>
</ul></section><section><h2>异步<a href="#异步"><span>#</span></a></h2><p>异步架构通过消息队列构建。消息的生产者将消息发送到消息队列以后，由消息的消费者从消息队列中获取消息，然后进行业务逻辑的处理，消息的生产者和消费者是异步处理的，彼此不会等待阻塞，所以叫做异步架构。</p><p>两种模型：</p><ol>
<li>
<p>点对点模型
消费者和生产者只需要知道消息队列的名字，生产者发送消息到消息队列中，而消息队列的另一端是多个消费者竞争消费消息，每个到达消息队列的消息只会被路由到一个消费者中去。</p>
</li>
<li>
<p>发布订阅模型
生产者发送消息到一个主题，消息被发布到主题后，就会被克隆给每一个订阅它的消费者，每个消费者接收一份消息复制到自己的私有队列。消费者可以独立于其他消费者使用自己订阅的消息，消费者之间不会竞争消息。</p>
</li>
</ol><p>优点：</p><ul>
<li>实现异步处理，提升处理性能</li>
<li>让系统获得更好的伸缩性</li>
<li>平衡流量峰值</li>
<li>使生产者和消费者的代码实现解耦合</li>
</ul><p>优秀产品：</p><p>RabbitMQ，开源的消息代理和队列服务器，用来通过普通协议在完全不同的应用之间共享数据，或者简单的将作业排队以便让分布式服务器进行处理。</p></section><section><h2>高并发<a href="#高并发"><span>#</span></a></h2><p>常用的手段有：</p><ul>
<li>消息队列：解耦和削峰，应用之间通过消息传递进行通信</li>
<li>读写分离：将数据库的读和写操作分不到不同的数据库节点上。主服务器负责写，从服务器负责读。另外，一主一从或者一主多从都可以。读写分离可以大幅提高读性能，小幅提高写的性能。因此，读写分离更适合单机并发读请求比较多的场景</li>
<li>分库分表：解决由于库、表数据量过大，而导致数据库性能持续下降的问题</li>
<li>负载均衡： 将任务比如用户请求处理分配到多个服务器处理以提高网站、应用或者数据库的性能和可靠性。常见的负载均衡系统包括3种：
<ul>
<li>DNS负载均衡：一般用来实现地理级别的均衡</li>
<li>硬件负载均衡：通过单独的硬件设备比如 F5 来实现负载均衡功能（硬件的价格一般很贵）</li>
<li>软件负载均衡：通过负载均衡软件比如 Nginx 来实现负载均衡功能</li>
</ul>
</li>
</ul></section><section><h2>高可用<a href="#高可用"><span>#</span></a></h2><p>“高可用性”（High Availability）通常来描述一个系统经过专门的设计，从而减少停工时间，而保持其服务的高度可用性。简而言之，就是不间断对外提供服务。</p><p>为了保证高可用性，常用的手段有：</p><ul>
<li>限流：限流是从用户访问压力的角度来考虑如何应对系统故障。限流为了对服务端的接口接受请求的频率进行限制，防止服务挂掉。比如某一接口的请求限制为 100 个每秒, 对超过限制的请求放弃处理或者放到队列中等待处理</li>
<li>降级：从系统功能优先级的角度考虑如何应对系统故障。服务降级指的是当服务器压力剧增的情况下，根据当前业务情况及流量对一些服务和页面有策略的降级，以此释放服务器资源以保证核心任务的正常运行</li>
<li>熔断：熔断和降级是两个比较容易混淆的概念。熔断的目的在于应对当前系统依赖的外部系统或者第三方系统的故障</li>
<li>排队：可以看作是另类的限流方式，控制单位时间提供服务的数量</li>
<li>集群：相同的服务部署多份，避免单点故障</li>
<li>超时和重试机制：一旦用户的请求超过某个时间得不到响应就结束此次请求并抛出异常</li>
</ul><p>具体到核心技术：</p><ul>
<li>CDN加速，服务器上存储的静态内容缓存在云CDN节点上，用户无需访问服务器源站，就近访问云CDN节点即可获取相同内容，既能达到加速的效果，又能减轻服务器源站的压力。</li>
<li>缓存，比如使用redis作为缓存服务器，用户的访问流量在到达数据库之前直接过滤掉一大部分</li>
<li>负载均衡，将流量分发到多个服务器</li>
<li>拆分服务，降低服务之间的耦合程度</li>
</ul></section><section><h2>伸缩性<a href="#伸缩性"><span>#</span></a></h2><p>指不断向集群中添加服务器来缓解不断上升的用户并发访问压力和不断增长的数据存储需求。</p><p>应用服务器只要不具有状态，那么就可以很容易地通过负载均衡器向集群中添加新的服务器。</p><p>关系型数据库的伸缩性通过 Sharding 来实现，将数据按一定的规则分布到不同的节点上，从而解决单台存储服务器的存储空间限制。</p></section><section><h2>可扩展<a href="#可扩展"><span>#</span></a></h2><p>核心：把大的系统拆分为小的系统</p><ul>
<li>面向流程拆分
<ul>
<li>把不同模块按照职责分开，每层中的组件只处理本层的逻辑。这样就可以支持系统在某层上的快速扩展</li>
</ul>
</li>
<li>面向服务拆分
<ul>
<li>微服务</li>
</ul>
</li>
<li>面向功能拆分
<ul>
<li>微内核，区分出核心系统和插件模块</li>
</ul>
</li>
</ul></section></section>
<section><h1>分布式系统<a href="#分布式系统"><span>#</span></a></h1><section><h2>简介与优点<a href="#简介与优点"><span>#</span></a></h2><p>分布式系统是一个建立于网络上的系统，其组成部分位于不同的联网计算机上(表示为节点)，它们通过相互传递信息来沟通和协调行动。</p><p>分布式系统应具有以下四个特征：</p><ul>
<li>分布性。分布式系统由多台计算机组成，它们在地域上是分散的，可以散布在一个单位、一个城市、一个国家，甚至全球范围内。整个系统的功能是分散在各个节点上实现的，因而分布式系统具有数据处理的分布性。</li>
<li>自治性。分布式系统中的各个节点都包含自己的处理机和内存，各自具有独立的处理数据的功能。通常，彼此在地位上是平等的，无主次之分，既能自治地进行工作，又能利用共享的通信线路来传送信息，协调任务处理。</li>
<li>并行性。一个大的任务可以划分为若干个子任务，分别在不同的主机上执行。</li>
<li>全局性。分布式系统中必须存在一个单一的、全局的进程通信机制，使得任何一个进程都能与其他进程通信，并且不区分本地通信与远程通信。同时，还应当有全局的保护机制。系统中所有机器上有统一的系统调用集合，它们必须适应分布式的环境。在所有CPU上运行同样的内核，使协调工作更加容易。</li>
</ul><p>分布式系统的优点：</p><ul>
<li>多主机并发执行任务，效率高</li>
<li>可扩展性好，如果工作量增大，用户只需要向网络中添加主机即可，而不用重新更新或设计系统</li>
<li>容错率高，局部节点出现故障不影响整个系统的运行</li>
</ul></section><section><h2>分布式系统单节点故障处理<a href="#分布式系统单节点故障处理"><span>#</span></a></h2><ul>
<li>集群管理的服务器会将通向该节点上的连接重定向到其他节点上</li>
<li>每一个节点的数据都会被事先复制到其他的所有节点上，因此可以从其他节点的备份数据里获取到需要的信息；也可以用这些备份数据完成之后的数据恢复</li>
</ul></section><section><h2>分布式系统下的Session问题<a href="#分布式系统下的session问题"><span>#</span></a></h2><p>分布式状态下Session的问题：负载均衡多服务器的情况，不好确认当前用户是否登录，因为多服务器不共享Session。</p><p>解决方法：</p><ul>
<li>把用户访问页面产生的Session放到Cookie里面，以Cookie为中转站，如果服务器没有Session信息就检查客户端Cookie里有没有，如果有就用Cookie里的信息同步 (简单，服务器负担小；Cookie可能会被禁用，并且安全性不高)</li>
<li>memcached，把web服务器中的内存组合起来，成为一个”内存池”，不管是哪个服务器产生的 Session都可以放到这个”内存池”中，其他的都可以使用
<ul>
<li>服务器负担小，安全，内存读写快</li>
<li>把内存分成固定大小的内存块，无法完全利用，会产生碎片或者溢出问题</li>
</ul>
</li>
<li>Token, 客户端登陆传递信息给服务端，服务端收到后把用户信息加密（Token）传给客户端，客户端将Token存放于localStroage等容器中。客户端每次访问都传递Token，服务端解密Token，就知道这个用户是谁了。通过cpu加解密，服务端就不需要存储session占用存储空间</li>
</ul></section><section><h2>负载均衡<a href="#负载均衡"><span>#</span></a></h2><p>负载均衡的核心是将流量分发到多个服务器，常见的方法有：</p><ul>
<li>轮转法：将请求按顺序轮流分配到后端服务器上，不关心服务器实际的连接数和系统负载。在此基础上，还可以给配置高、负载低的机器配置更高的权重，配置低、负载高的机器分配较低的权重，通过加权轮转保证正常处理用户请求</li>
<li>随机法：从后端服务器列表中随机选取一台服务器进行访问。当用户访问次数不断增大的时候，效果会越来越接近轮转法</li>
<li>IP哈希法：获取客户端的IP地址，通过哈希函数计算得到的一个数值，用该数值对服务器列表的大小进行取模运算，得到的结果便是客服端要访问服务器的序号。</li>
<li>最小连接数法：根据后端服务器当前的连接情况，动态选取当前连接数最少的一台服务器来处理当前的请求，尽可能提高后端服务的利用效率</li>
</ul></section><section><h2>一致性哈希算法<a href="#一致性哈希算法"><span>#</span></a></h2><p>假如有N个缓存服务器，通用方法是计算访问对象的哈希值，再通过取模运算均匀的映射到N个缓存上。但如果某一天一个缓存服务器挂了，或者是访问加重，多加了一台服务器，取模映射公式中的N就变成了N-1或N+1，这导致突然之间几乎所有缓存都失效了，因为客户请求对象时的哈希值往往依赖于节点数量，不同的哈希值导致找不到原来保存这个对象的服务器节点。</p><p>一致性哈希将整个哈希值空间组织成一个虚拟的圆环，如假设某哈希函数值空间为0 ～ 2-1（即哈希值是一个32位无符号整数）。每台服务器可以选择服务器的IP或主机名作为关键字进行哈希，这样就能确定其在哈希环上的位置。而数据key使用相同的函数Hash计算出哈希值，并确定此数据在环上的位置，从此位置沿环顺时针“行走”，第一台遇到的服务器就是其应该访问定位到的服务器。一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据，具有较好的容错性和可扩展性。</p><p></p><figure><img src="/blog-assets/images/DistributedSystems/consistent-hash.png" alt="consistent-hash.png" /><figcaption>consistent-hash.png</figcaption></figure><p></p><p>如果服务器发生变化：</p><ul>
<li>如果一台服务器不可用，则受影响的数据仅仅是此服务器到其环空间中前一台服务器（即沿着逆时针方向行走遇到的第一台服务器）之间的数据，它们会被定位到顺时针行走到达的第一台服务器；其它数据不会受到影响。</li>
<li>如果增加一台服务器，则受影响的数据仅仅是新服务器到其环空间中前一台服务器（即沿着逆时针方向行走遇到的第一台服务器）之间的数据，它们会被定位到新服务器上；其它数据也不会受到影响。</li>
</ul><p>同时，一致性哈希算法引入了虚拟节点机制，即对每一个服务节点计算多个哈希，每个计算结果位置都放置一个此服务节点，称为虚拟节点。数据定位算法不变，只是多了一步虚拟节点到实际节点的映射，例如定位到“Node A#1”、“Node A#2”、“Node A#3”三个虚拟节点的数据均定位到Node A上。这样就解决了服务节点少时数据倾斜的问题。</p></section></section>
<section><h1>架构演进<a href="#架构演进"><span>#</span></a></h1><section><h2>单一应用架构<a href="#单一应用架构"><span>#</span></a></h2><p>当网站流量很小时，只需一个应用，将所有功能都部署在一起，以减少部署节点和成本。此时，用于简化增删改查工作量的数据访问框架(ORM)是关键。</p></section><section><h2>垂直应用架构<a href="#垂直应用架构"><span>#</span></a></h2><p>当访问量逐渐增大，单一应用增加机器带来的加速度越来越小，提升效率的方法之一是将应用拆成互不相干的几个应用，以提升效率。此时，用于加速前端页面开发的Web框架是关键。</p></section><section><h2>分布式服务架构<a href="#分布式服务架构"><span>#</span></a></h2><p>当垂直应用越来越多，应用之间交互不可避免，将核心业务抽取出来，作为独立的服务，逐渐形成稳定的服务中心，使前端应用能更快速的响应多变的市场需求。此时，用于提高业务复用及整合的分布式服务框架(RPC)是关键。</p></section><section><h2>流动计算架构<a href="#流动计算架构"><span>#</span></a></h2><p>当服务越来越多，容量的评估，小服务资源的浪费等问题逐渐显现，此时需增加一个调度中心基于访问压力实时管理集群容量，提高集群利用率。此时，用于提高机器利用率的资源调度和治理中心(SOA)是关键。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2020-01-01-leetcode1-100/</id>
      <title type="text">LeetCode 1-100</title>
      <published>2020-01-01T00:00:00.000Z</published>
      <updated>2020-01-01T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2020-01-01-leetcode1-100/"/>
      <summary type="text">LeetCode Problems 1-100.</summary>
      <content type="html"><![CDATA[<p>LeetCode Problems 1-100.</p>

<section><h2>1. Two Sum<a href="#1-two-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/two-sum/" target="_blank">https://leetcode.com/problems/two-sum/</a></p><hr /><p>我们需要保证<code>nums[i]</code>和<code>target - nums[i]</code>都在数组中，因此使用哈希表存储循环遍历时每个数<code>nums[i]</code>以及下标<code>i</code>的值，并检查<code>target - nums[i]</code>是否也在map中，如果存在，就可以直接提取两个数的位置得到结果。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>twoSum</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[] {};</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>2</span><span>];</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// &lt;Element, Index&gt;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span><span>(target </span><span>-</span><span> nums[i])) {</span></span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>result[</span><span>0</span><span><span>] </span><span>=</span><span> i;</span></span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>result[</span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>map</span><span>.</span><span>get</span><span><span>(target </span><span>-</span><span> nums[i]);</span></span></div></div><div><div><div>15</div></div><div><span>                </span><span>return</span><span> result;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(nums[i], i);</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>2. Add Two Numbers<a href="#2-add-two-numbers"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/add-two-numbers/" target="_blank">https://leetcode.com/problems/add-two-numbers/</a></p><hr /><p>加法运算是一个从低位到高位的循环过程，只要下列3个条件之一满足，就会一直持续下去：</p><ul>
<li>
<p>第一个数某位不为空</p>
</li>
<li>
<p>第二个数某位不为空</p>
</li>
<li>
<p>进位不为0</p>
</li>
</ul><p>因此我们创建一个新链表，按照上述条件，对<code>l1</code>和<code>l2</code>逐位计算相加，得到结果后创建一个新节点插入到链表中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>addTwoNumbers</span><span>(</span><span>ListNode</span><span><span> </span><span>l1</span><span>, </span></span><span>ListNode</span><span><span> </span><span>l2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (l1 </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> l2;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span><span> (l2 </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>return</span><span> l1;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>dummyHead</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>0</span><span>); </span><span>// dummy head of new list</span></div></div><div><div><div>21</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> dummyHead; </span></span><span>// traverse new list</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>int</span><span><span> </span><span>carry</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>// still have digits</span></div></div><div><div><div>26</div></div><div><span>        </span><span>while</span><span><span> (l1 </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> l2 </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> carry </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>int</span><span><span> </span><span>val</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>            </span><span>int</span><span><span> </span><span>val1</span><span> </span></span><span><span>=</span><span> l1 </span><span>!=</span><span> </span></span><span>null</span><span> </span><span>?</span><span> </span><span>l1</span><span>.</span><span>val</span><span> </span><span>:</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>30</div></div><div><span>            </span><span>int</span><span><span> </span><span>val2</span><span> </span></span><span><span>=</span><span> l2 </span><span>!=</span><span> </span></span><span>null</span><span> </span><span>?</span><span> </span><span>l2</span><span>.</span><span>val</span><span> </span><span>:</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>val </span><span>=</span><span> (val1 </span><span>+</span><span> val2 </span><span>+</span><span> carry) </span><span>%</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>carry </span><span>=</span><span> (val1 </span><span>+</span><span> val2 </span><span>+</span><span> carry) </span><span>/</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>            </span><span>// insert a new node</span></div></div><div><div><div>36</div></div><div><span>            </span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(val);</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>            </span><span>// move pointers forward</span></div></div><div><div><div>40</div></div><div><span>            </span><span>if</span><span><span> (l1 </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>41</div></div><div><span><span>                </span></span><span>l1 </span><span>=</span><span> </span><span>l1</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span>            </span><span>if</span><span><span> (l2 </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>44</div></div><div><span><span>                </span></span><span>l2 </span><span>=</span><span> </span><span>l2</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span>        </span><span>return</span><span> </span><span>dummyHead</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>49</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>3. Longest Substring Without Repeating Characters<a href="#3-longest-substring-without-repeating-characters"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-substring-without-repeating-characters/" target="_blank">https://leetcode.com/problems/longest-substring-without-repeating-characters/</a></p><hr /><p>我们需要一个map记录每个字符最后一次出现的位置。由于<code>s</code>中的字符已经确定是英文字母或者符号，因此可以使用定长数组模拟map，提高运行效率。</p><p>定义两个指针<code>begin</code>和<code>end</code>，<code>begin</code>指向最长不重复子串起点，尾指针用于遍历<code>s</code>，判断当前字符是否于map中。我们的目标就是尾指针完成遍历后，通过两个指针的最大距离差值，得到最长的不重复子串长度。</p><p>遍历时需要注意，在遇到重复字符时，<code>begin</code>有两种更新方式：</p><ul>
<li>
<p>这个字符上一次出现位置的后面（+1），这是满足不重复的前提下的最小取值</p>
</li>
<li>
<p>保持不变，因为有可能这个重复字符上一次出现的位置相当靠前，在<code>[map[currentChar] + 1, begin]</code>中间出现了其他的重复字符</p>
</li>
</ul><p>具体选择哪种方式更新，只需比较当前<code>begin</code>和上一次出现位置+1的大小。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>lengthOfLongestSubstring</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>array</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>begin</span><span>, </span><span>end</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// two pointers to mark the longest substring</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// longest substring's length</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>128</span><span>]; </span><span>// &lt;Character, Index&gt;</span></div></div><div><div><div>13</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span><span>(map, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>for</span><span><span> (begin </span><span>=</span><span> </span></span><span>0</span><span><span>, end </span><span>=</span><span> </span></span><span>0</span><span><span>; end </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); end++) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>char</span><span><span> </span><span>currentChar</span><span> </span></span><span><span>=</span><span> array[end];</span></span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>            </span><span>// if this is a repeating character, we either reset begin index to last appearance index + 1 to avoid duplicate</span></div></div><div><div><div>19</div></div><div><span>            </span><span>// or remains unchanged. It is possible that [map[currentChar] + 1, begin] contains duplicate characters</span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span><span> (map[currentChar] </span><span>&gt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>begin </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(begin, map[currentChar] </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>            </span><span>// update current character's last position index</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>map[currentChar] </span><span>=</span><span> end;</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>            </span><span>// update result</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, end </span><span>-</span><span> begin </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>4. Median of Two Sorted Arrays<a href="#4-median-of-two-sorted-arrays"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/median-of-two-sorted-arrays/" target="_blank">https://leetcode.com/problems/median-of-two-sorted-arrays/</a></p><hr /><p>对于一个有序数组，我们做一次分割，将数组分割为两半部分，则数组中位数为下半部分最大值与上半部分最小值的平均值。这种取法的前提是两半部分具有相同的元素值。当数组中有偶数个元素时，分割很容易；而当有奇数个元素时，我们尝试将实际的中位数<code>mid</code>一分为二，这样两部分都有了这个<code>mid</code>，数组的中位数仍然可以用<code>(mid + mid) / 2 = mid</code>得到。</p><p>对于一个有<code>N</code>个元素的数组，如果定义分割左侧的数为<code>L</code>，右侧的数为<code>R</code>，则它们可以表示为：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>L = nums[(N - 1) / 2]</span></div></div><div><div><div>2</div></div><div><span>R = nums[N/2]</span></div></div><div><div><div>3</div></div><div><span>mid = (L + R) / 2</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>现在，假设为元素之间的间隔也增加下标。例如：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[6 9 13 18]  -&gt;   [# 6 # 9 # 13 # 18 #]    (N = 4)</span></div></div><div><div><div>2</div></div><div><span>position index     0 1 2 3 4 5  6 7  8     (N_Position = 9)</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>[6 9 11 13 18]-&gt;   [# 6 # 9 # 11 # 13 # 18 #]   (N = 5)</span></div></div><div><div><div>5</div></div><div><span>position index      0 1 2 3 4 5  6 7  8 9 10    (N_Position = 11)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>易得知，总共有<code>2N + 1</code>个下标位，并且分割的位置一定在下标为<code>N</code>处。因此仍然有</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>index(L) = (N - 1) / 2</span></div></div><div><div><div>2</div></div><div><span>index(R) = N / 2</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>至此，我们完成了单个数组的推导。扩展到两个有序数组时，我们可以总结出：</p><ul>
<li>一共有<code>2M + 2N + 2</code>个下标位</li>
<li>需要2个切割点，下标设定为<code>C1</code>和<code>C2</code></li>
<li>切割的左侧和右侧总共都有<code>M + N</code>个元素</li>
</ul><p>假设<code>nums2</code>是长度较短的数组，并且切割点的下标为<code>C2 = K</code>，则<code>nums1</code>的切割点下标为<code>C1 = M + N - K</code>。完成这两次切割后，我们可以得到切割点附近的四个下标：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>L1 = nums1[(C1 - 1) / 2]</span></div></div><div><div><div>2</div></div><div><span>R1 = nums1[C1/2]</span></div></div><div><div><div>3</div></div><div><span>L2 = nums2[(C2 - 1) / 2]</span></div></div><div><div><div>4</div></div><div><span>R2 = nums2[C2/2]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>为了保证我们的切割是合理的，我们需要保证：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>L1 &lt;= R1</span></div></div><div><div><div>2</div></div><div><span>L1 &lt;= R2</span></div></div><div><div><div>3</div></div><div><span>L2 &lt;= R1</span></div></div><div><div><div>4</div></div><div><span>L2 &lt;= R2</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>显然，第1、4个条件是肯定满足的，因此只有中间两个条件满足时，我们才能得到正确的划分。此时，我们可以引用二分搜索。如果<code>L1 &gt; R2</code>，说明<code>nums1</code>中的切割点取的过大，需要缩小，换言之，我们可以调整<code>nums2</code>中的切割点，使其变大并超过<code>nums1</code>中的切割点；而如果<code>L2 &gt; R1</code>，说明<code>nums2</code>中的切割点取的过大，缩小即可。完成切分点的选取后，选取两个子数组相应的最大最小值取平均，即可得到最终答案。</p><p>需要注意的是，切割点的下标有可能会发生数组越界。只需假设数组两端各自存在一个极值，当切割点越界时自动赋极值即可解决。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>double</span><span> </span><span>findMedianSortedArrays</span><span>(</span><span>int</span><span><span>[] </span><span>nums1</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>nums1</span><span>.</span><span>length</span><span><span>, n </span><span>=</span><span> </span></span><span>nums2</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// make sure nums2 is the smaller array</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (m </span><span>&lt;</span><span> n) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> </span><span>findMedianSortedArrays</span><span>(nums2, nums1);</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>low</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, high </span><span>=</span><span> n </span><span>*</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>11</div></div><div><span>        </span><span>while</span><span><span> (low </span><span>&lt;=</span><span> high) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>int</span><span><span> </span><span>cut2</span><span> </span></span><span><span>=</span><span> (low </span><span>+</span><span> high) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>13</div></div><div><span>            </span><span>int</span><span><span> </span><span>cut1</span><span> </span></span><span><span>=</span><span> m </span><span>+</span><span> n </span><span>-</span><span> cut2;</span></span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>            </span><span>// avoid boundary exception</span></div></div><div><div><div>16</div></div><div><span>            </span><span>double</span><span><span> </span><span>L1</span><span> </span></span><span><span>=</span><span> (cut1 </span><span>==</span><span> </span></span><span>0</span><span>) </span><span>?</span><span> </span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span> </span><span>:</span><span><span> nums1[(cut1</span><span>-</span></span><span>1</span><span><span>)</span><span>/</span></span><span>2</span><span>];</span></div></div><div><div><div>17</div></div><div><span>            </span><span>double</span><span><span> </span><span>L2</span><span> </span></span><span><span>=</span><span> (cut2 </span><span>==</span><span> </span></span><span>0</span><span>) </span><span>?</span><span> </span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span> </span><span>:</span><span><span> nums2[(cut2</span><span>-</span></span><span>1</span><span><span>)</span><span>/</span></span><span>2</span><span>];</span></div></div><div><div><div>18</div></div><div><span>            </span><span>double</span><span><span> </span><span>R1</span><span> </span></span><span><span>=</span><span> (cut1 </span><span>==</span><span> m </span><span>*</span><span> </span></span><span>2</span><span>) </span><span>?</span><span> </span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span> </span><span>:</span><span><span> nums1[(cut1)</span><span>/</span></span><span>2</span><span>];</span></div></div><div><div><div>19</div></div><div><span>            </span><span>double</span><span><span> </span><span>R2</span><span> </span></span><span><span>=</span><span> (cut2 </span><span>==</span><span> n </span><span>*</span><span> </span></span><span>2</span><span>) </span><span>?</span><span> </span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span> </span><span>:</span><span><span> nums2[(cut2)</span><span>/</span></span><span>2</span><span>];</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>if</span><span><span> (L1 </span><span>&gt;</span><span> R2) {</span></span></div></div><div><div><div>22</div></div><div><span>                </span><span>// nums1's lower half is too big; need to move C1 left (C2 right)</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>low </span><span>=</span><span> cut2 </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (L2 </span><span>&gt;</span><span> R1) {</span></span></div></div><div><div><div>25</div></div><div><span>                </span><span>// nums2's lower half too big; need to move C2 left.</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>high </span><span>=</span><span> cut2 </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>28</div></div><div><span>                </span><span>// Otherwise, that's the right cut.</span></div></div><div><div><div>29</div></div><div><span>                </span><span>return</span><span> (</span><span>Math</span><span>.</span><span>max</span><span><span>(L1, L2) </span><span>+</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span><span>(R1, R2)) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>        </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>5. Longest Palindromic Substring<a href="#5-longest-palindromic-substring"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-palindromic-substring/" target="_blank">https://leetcode.com/problems/longest-palindromic-substring/</a></p><hr /><p>遍历每一个字符，每一个字符都向两侧延展，如果新延展得到的两个字符仍然相同则继续延展，以此计算能延展的最大长度。</p><p>考虑到回文字符串的长度有两种可能，需要按照奇偶性进行两次延展判断。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> startIndex </span><span><span>=</span><span> </span></span><span>0</span><span><span>,</span><span> maxLen </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>checkPalindrome</span><span>(</span><span>char</span><span><span>[] </span><span>array</span><span>, </span></span><span>int</span><span><span> </span><span>left</span><span>, </span></span><span>int</span><span><span> </span><span>right</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> right </span><span>&lt;=</span><span> </span></span><span>array</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> array[left] </span><span>==</span><span> array[right]) {</span></span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>left--;</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>right++;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// update maxLen = (right - 1) - (left + 1) + 1 = right - left - 1</span></div></div><div><div><div>11</div></div><div><span>        </span><span>if</span><span><span> (maxLen </span><span>&lt;</span><span> right </span><span>-</span><span> left </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>maxLen </span><span>=</span><span> right </span><span>-</span><span> left </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>startIndex </span><span>=</span><span> left </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>longestPalindrome</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> s;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>array</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>23</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>array</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>checkPalindrome</span><span>(array, i, i); </span><span>// assume odd length</span></div></div><div><div><div>25</div></div><div><span>            </span><span>checkPalindrome</span><span><span>(array, i, i</span><span>+</span></span><span>1</span><span>); </span><span>// assume even length</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> </span><span>s</span><span>.</span><span>substring</span><span><span>(startIndex, startIndex </span><span>+</span><span> maxLen);</span></span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>6. Zigzag Conversion<a href="#6-zigzag-conversion"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/zigzag-conversion/" target="_blank">https://leetcode.com/problems/zigzag-conversion/</a></p><hr /><p>根据<code>numRows</code>的长度建立等长的StringBuilder数组，每一行对应一个StringBuilder。按照“竖直向下——斜向右上”的顺序不断向当前行的StringBuilder添加字符串中的字符即可。输出时，要对StringBuilder进行格式转化。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>convert</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>int</span><span><span> </span><span>numRows</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// every row is a StringBuilder</span></div></div><div><div><div>6</div></div><div><span>        </span><span>StringBuilder</span><span><span>[] </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>[numRows];</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> numRows; i++) {</span></span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>sb[i] </span><span>=</span><span> </span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>// index to traverse the whole string</span></div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>13</div></div><div><span>        </span><span>while</span><span><span> (index </span><span>&lt;</span><span> len) {</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>// vertically down</span></div></div><div><div><div>15</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> numRows </span><span>&amp;&amp;</span><span> index </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>sb[i].</span><span>append</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span>(index++));</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>// obliquely up (not include the first and last row)</span></div></div><div><div><div>20</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> numRows </span><span>-</span><span> </span></span><span>2</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> index </span><span>&lt;</span><span> len; i--) {</span></span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>sb[i].</span><span>append</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span>(index++));</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>// append all rows of result</span></div></div><div><div><div>26</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> numRows; i++) {</span></span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>sb[</span><span>0</span><span>].</span><span>append</span><span>(sb[i]);</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span> sb[</span><span>0</span><span>].</span><span>toString</span><span>();</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>7. Reverse Integer<a href="#7-reverse-integer"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reverse-integer/" target="_blank">https://leetcode.com/problems/reverse-integer/</a></p><hr /><p>通过整除反向提取每一位数。为了预防范围溢出，需要在每一次提取后进行一次溢出判断。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>reverse</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>long</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>while</span><span><span> (x </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>// obtain the last bit</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> result </span><span>*</span><span> </span><span>10</span><span><span> </span><span>+</span><span> x </span><span>%</span><span> </span></span><span>10</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>x </span><span>/=</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>            </span><span>// overflow check</span></div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span><span> (result </span><span>&gt;</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span><span> </span><span>||</span><span> result </span><span>&lt;</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>                </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> (</span><span>int</span><span>)result;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>8. String to Integer (atoi)<a href="#8-string-to-integer-atoi"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/string-to-integer-atoi/" target="_blank">https://leetcode.com/problems/string-to-integer-atoi/</a></p><hr /><p>流程分为三步：</p><ol>
<li>去除字符串开头的空格</li>
<li>判断是否存在正负号</li>
<li>判断是否为数字。如果是数字，更新运算结果，并检查当前结果是否超出整数范围；如果不是数字，则返回当前结果</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>myAtoi</span><span>(</span><span>String</span><span><span> </span><span>str</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// trim leading blank space</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>str </span><span>=</span><span> </span><span>str</span><span>.</span><span>trim</span><span>();</span></div></div><div><div><div>5</div></div><div><span>        </span><span>if</span><span> (</span><span>str</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// detect sign</span></div></div><div><div><div>10</div></div><div><span>        </span><span>char</span><span><span> </span><span>firstChar</span><span> </span></span><span><span>=</span><span> </span></span><span>str</span><span>.</span><span>charAt</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>sign</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span> </span><span>digitStart</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// default no sign char, thus digit start from index 0</span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (firstChar </span><span>==</span><span> </span></span><span>'+'</span><span><span> </span><span>||</span><span> firstChar </span><span>==</span><span> </span></span><span>'-'</span><span>) {</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>sign </span><span>=</span><span> (firstChar </span><span>==</span><span> </span><span>'+'</span><span>) </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>digitStart++;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>// add digits</span></div></div><div><div><div>19</div></div><div><span>        </span><span>long</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> digitStart; i </span><span>&lt;</span><span> </span></span><span>str</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>char</span><span><span> </span><span>current</span><span> </span></span><span><span>=</span><span> </span></span><span>str</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>            </span><span>// non-digit, return sum immediately</span></div></div><div><div><div>24</div></div><div><span>            </span><span>if</span><span><span> (current </span><span>&lt;</span><span> </span></span><span>'0'</span><span><span> </span><span>||</span><span> current </span><span>&gt;</span><span> </span></span><span>'9'</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>                </span><span>return</span><span> (</span><span>int</span><span><span>)sum </span><span>*</span><span> sign;</span></span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>            </span><span>// continue adding current digit</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>sum </span><span>=</span><span> sum </span><span>*</span><span> </span><span>10</span><span><span> </span><span>+</span><span> current </span><span>-</span><span> </span></span><span>'0'</span><span>;</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>            </span><span>// overflow checking</span></div></div><div><div><div>32</div></div><div><span>            </span><span>if</span><span><span> (sign </span><span>==</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> sum </span><span>&gt;</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>) {</span></div></div><div><div><div>33</div></div><div><span>                </span><span>return</span><span> </span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>            </span><span>if</span><span><span> (sign </span><span>==</span><span> </span><span>-</span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> </span><span>-</span><span>sum </span><span>&lt;</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>) {</span></div></div><div><div><div>36</div></div><div><span>                </span><span>return</span><span> </span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> (</span><span>int</span><span><span>)sum </span><span>*</span><span> sign;</span></span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>9. Palindrome Number<a href="#9-palindrome-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/palindrome-number/" target="_blank">https://leetcode.com/problems/palindrome-number/</a></p><hr /><p>将数字反转后与原数字进行比较。注意，不需要完整地将整个数字进行反转，只需要反转一半的数字，并与剩余一半进行比较即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isPalindrome</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// exclude negative number and 10's multiple</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (x </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> (x </span><span>!=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> x </span><span>%</span><span> </span></span><span>10</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>)) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// only need to reverse half of all digits</span></div></div><div><div><div>11</div></div><div><span>        </span><span>while</span><span><span> (x </span><span>&gt;</span><span> result) {</span></span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> result </span><span>*</span><span> </span><span>10</span><span><span> </span><span>+</span><span> x </span><span>%</span><span> </span></span><span>10</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>x </span><span>/=</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// odd or even length</span></div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span><span> (x </span><span>==</span><span> result </span><span>||</span><span> x </span><span>==</span><span> result </span><span>/</span><span> </span></span><span>10</span><span>);</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>10. Regular Expression Matching<a href="#10-regular-expression-matching"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/regular-expression-matching/" target="_blank">https://leetcode.com/problems/regular-expression-matching/</a></p><hr /><p>此题需要使用二维动态规划算法。对于<code>s</code>和<code>p</code>，我们需要从头开始推导出子字符串<code>s[i]</code>和<code>p[j]</code>的匹配情况，进而推出整个<code>s</code>和<code>p</code>是否匹配。</p><p>解决时，需要对题设条件进行分类讨论：</p><ul>
<li>最标准的匹配情况，即<code>string[i]</code> = <code>pattern[j]</code>，则<code>dp[i+1][j+1]</code> = <code>dp[i][j]</code></li>
<li>pattern中出现了<code>'.'</code>，可以匹配string中任意的一个字符，同样有<code>dp[i+1][j+1]</code> = <code>dp[i][j]</code></li>
<li>pattern中出现了<code>'*'</code>，需要进一步讨论：
<ul>
<li>如果<code>pattern[j-1]</code> != <code>string[i]</code>，说明此时的<code>'a*'</code>只能作为空字符串匹配，因此<code>dp[i+1][j+1]</code> = <code>dp[i+1][j-1]</code></li>
<li>如果<code>pattern[j-1]</code> == <code>string[i]</code>, 或是<code>pattern[j-1]</code> == <code>'.'</code>，即在’*‘之前的一个字符也能够匹配上，则：
<ul>
<li>如果<code>'*'</code>匹配空字符串，则<code>dp[i+1][j+1]</code> = <code>dp[i+1][j-1]</code></li>
<li>如果<code>'*'</code>匹配一个字符，则<code>dp[i+1][j+1]</code> = <code>dp[i+1][j]</code></li>
<li>如果<code>'*'</code>匹配多个字符，则<code>dp[i+1][j+1]</code> = <code>dp[i][j+1]</code></li>
</ul>
</li>
</ul>
</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isMatch</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>String</span><span><span> </span><span>p</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>boolean</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span>[</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>+</span><span> </span></span><span>1</span><span>][</span><span>p</span><span>.</span><span>length</span><span><span>() </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// s and p are both empty, so they can match</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span>][</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// pattern cannot start with '*'</span></div></div><div><div><div>9</div></div><div><span>        </span><span>if</span><span> (</span><span>p</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>p</span><span>.</span><span>charAt</span><span>(</span><span>0</span><span><span>) </span><span>==</span><span> </span></span><span>'*'</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// '*' match</span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>p</span><span>.</span><span>length</span><span>(); j++) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span> (</span><span>p</span><span>.</span><span>charAt</span><span><span>(j) </span><span>==</span><span> </span></span><span>'*'</span><span><span> </span><span>&amp;&amp;</span><span> dp[</span></span><span>0</span><span><span>][j</span><span>-</span></span><span>1</span><span>]) {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>dp[</span><span>0</span><span><span>][j</span><span>+</span></span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>p</span><span>.</span><span>length</span><span>(); j++) {</span></div></div><div><div><div>22</div></div><div><span>                </span><span>// regular matching, or '.' matching</span></div></div><div><div><div>23</div></div><div><span>                </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>p</span><span>.</span><span>charAt</span><span><span>(j) </span><span>||</span><span> </span></span><span>p</span><span>.</span><span>charAt</span><span><span>(j) </span><span>==</span><span> </span></span><span>'.'</span><span>) {</span></div></div><div><div><div>24</div></div><div><span><span>                    </span></span><span>dp[i</span><span>+</span><span>1</span><span><span>][j</span><span>+</span></span><span>1</span><span><span>] </span><span>=</span><span> dp[i][j];</span></span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>p</span><span>.</span><span>charAt</span><span><span>(j) </span><span>==</span><span> </span></span><span>'*'</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>                    </span><span>// * can only be matched as empty char</span></div></div><div><div><div>27</div></div><div><span>                    </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>!=</span><span> </span></span><span>p</span><span>.</span><span>charAt</span><span><span>(j</span><span>-</span></span><span>1</span><span>)) {</span></div></div><div><div><div>28</div></div><div><span><span>                        </span></span><span>dp[i</span><span>+</span><span>1</span><span><span>][j</span><span>+</span></span><span>1</span><span><span>] </span><span>=</span><span> dp[i</span><span>+</span></span><span>1</span><span><span>][j</span><span>-</span></span><span>1</span><span>];</span></div></div><div><div><div>29</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>                    </span><span>// * can be matched as 0, 1 or multiple chars</span></div></div><div><div><div>32</div></div><div><span>                    </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>p</span><span>.</span><span>charAt</span><span><span>(j</span><span>-</span></span><span>1</span><span><span>) </span><span>||</span><span> </span></span><span>p</span><span>.</span><span>charAt</span><span><span>(j</span><span>-</span></span><span>1</span><span><span>) </span><span>==</span><span> </span></span><span>'.'</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>                        </span></span><span>dp[i</span><span>+</span><span>1</span><span><span>][j</span><span>+</span></span><span>1</span><span><span>] </span><span>=</span><span> dp[i</span><span>+</span></span><span>1</span><span><span>][j</span><span>-</span></span><span>1</span><span><span>] </span><span>||</span><span> dp[i</span><span>+</span></span><span>1</span><span><span>][j] </span><span>||</span><span> dp[i][j</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>34</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> dp[</span><span>s</span><span>.</span><span>length</span><span>()][</span><span>p</span><span>.</span><span>length</span><span>()];</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>11. Container With Most Water<a href="#11-container-with-most-water"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/container-with-most-water/" target="_blank">https://leetcode.com/problems/container-with-most-water/</a></p><hr /><p>问题转化为判断两个横坐标之间能够围成的最大面积。定义两个指针，一个指向数组头向尾遍历，另一个指向数组尾向头遍历。在遍历之前不断计算当前能围成的最大面积，并且向着可能进一步增大面积的方向移动指针。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxArea</span><span>(</span><span>int</span><span><span>[] </span><span>height</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (height </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>height</span><span>.</span><span>length</span><span><span> </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>height</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, current </span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// max area, current area</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>current </span><span>=</span><span> (right </span><span>-</span><span> left) </span><span>*</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(height[left], height[right]);</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, current);</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>            </span><span>// keep the higher edge, and try to increase the other edge</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span><span> (height[left] </span><span>&lt;</span><span> height[right]) {</span></span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>left++;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>right--;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>12. Integer to Roman<a href="#12-integer-to-roman"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/integer-to-roman/" target="_blank">https://leetcode.com/problems/integer-to-roman/</a></p><hr /><p>非常无聊的题目，直接穷举<code>nums</code>范围内各个基数单位，不断叠加上当前的最大基数对应的罗马字符。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>intToRoman</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>value</span><span> </span></span><span><span>=</span><span> {</span></span><span>1000</span><span>, </span><span>900</span><span>, </span><span>500</span><span>, </span><span>400</span><span>, </span><span>100</span><span>, </span><span>90</span><span>, </span><span>50</span><span>, </span><span>40</span><span>, </span><span>10</span><span>, </span><span>9</span><span>, </span><span>5</span><span>, </span><span>4</span><span>, </span><span>1</span><span>};</span></div></div><div><div><div>4</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>roman</span><span> </span></span><span><span>=</span><span> {</span></span><span>"M"</span><span>, </span><span>"CM"</span><span>, </span><span>"D"</span><span>, </span><span>"CD"</span><span>, </span><span>"C"</span><span>, </span><span>"XC"</span><span>, </span><span>"L"</span><span>, </span><span>"XL"</span><span>, </span><span>"X"</span><span>, </span><span>"IX"</span><span>, </span><span>"V"</span><span>, </span><span>"IV"</span><span>, </span><span>"I"</span><span>};</span></div></div><div><div><div>5</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>value</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>while</span><span><span> (num </span><span>&gt;=</span><span> value[i]) {</span></span></div></div><div><div><div>9</div></div><div><span>                </span><span>sb</span><span>.</span><span>append</span><span>(roman[i]);</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>num </span><span>=</span><span> num </span><span>-</span><span> value[i];</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>13. Roman to Integer<a href="#13-roman-to-integer"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/roman-to-integer/" target="_blank">https://leetcode.com/problems/roman-to-integer/</a></p><hr /><p>遇到可能包含歧义的字母（M, X, V等）时，额外判断后一个字母明确具体数字即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>romanToInt</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> len) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span>(i); </span><span>// current character</span></div></div><div><div><div>13</div></div><div><span>            </span><span>char</span><span><span> </span><span>nextChar</span><span> </span></span><span><span>=</span><span> </span></span><span>'.'</span><span>; </span><span>// if there is a next character</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>!=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>nextChar </span><span>=</span><span> </span><span>s</span><span>.</span><span>charAt</span><span><span>(i</span><span>+</span></span><span>1</span><span>);</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>            </span><span>// need to check IV and IX</span></div></div><div><div><div>19</div></div><div><span>            </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'I'</span><span>) {</span></div></div><div><div><div>20</div></div><div><span>                </span><span>if</span><span><span> (nextChar </span><span>==</span><span> </span></span><span>'V'</span><span>) {</span></div></div><div><div><div>21</div></div><div><span><span>                    </span></span><span>result </span><span>+=</span><span> </span><span>4</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>                    </span></span><span>i </span><span>+=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nextChar </span><span>==</span><span> </span></span><span>'X'</span><span>) {</span></div></div><div><div><div>24</div></div><div><span><span>                    </span></span><span>result </span><span>+=</span><span> </span><span>9</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>                    </span></span><span>i </span><span>+=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>27</div></div><div><span><span>                    </span></span><span>result </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>                    </span></span><span>i </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>            </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'V'</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> </span><span>5</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>i </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>            </span><span>// need to check XL and XC</span></div></div><div><div><div>38</div></div><div><span>            </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'X'</span><span>) {</span></div></div><div><div><div>39</div></div><div><span>                </span><span>if</span><span><span> (nextChar </span><span>==</span><span> </span></span><span>'L'</span><span>) {</span></div></div><div><div><div>40</div></div><div><span><span>                    </span></span><span>result </span><span>+=</span><span> </span><span>40</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>                    </span></span><span>i </span><span>+=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nextChar </span><span>==</span><span> </span></span><span>'C'</span><span>) {</span></div></div><div><div><div>43</div></div><div><span><span>                    </span></span><span>result </span><span>+=</span><span> </span><span>90</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>                    </span></span><span>i </span><span>+=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>46</div></div><div><span><span>                    </span></span><span>result </span><span>+=</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>47</div></div><div><span><span>                    </span></span><span>i </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>48</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>            </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'L'</span><span>) {</span></div></div><div><div><div>52</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> </span><span>50</span><span>;</span></div></div><div><div><div>53</div></div><div><span><span>                </span></span><span>i </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>54</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>            </span><span>// need to check CD and CM</span></div></div><div><div><div>57</div></div><div><span>            </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'C'</span><span>) {</span></div></div><div><div><div>58</div></div><div><span>                </span><span>if</span><span><span> (nextChar </span><span>==</span><span> </span></span><span>'D'</span><span>) {</span></div></div><div><div><div>59</div></div><div><span><span>                    </span></span><span>result </span><span>+=</span><span> </span><span>400</span><span>;</span></div></div><div><div><div>60</div></div><div><span><span>                    </span></span><span>i </span><span>+=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>61</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nextChar </span><span>==</span><span> </span></span><span>'M'</span><span>) {</span></div></div><div><div><div>62</div></div><div><span><span>                    </span></span><span>result </span><span>+=</span><span> </span><span>900</span><span>;</span></div></div><div><div><div>63</div></div><div><span><span>                    </span></span><span>i </span><span>+=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>64</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>65</div></div><div><span><span>                    </span></span><span>result </span><span>+=</span><span> </span><span>100</span><span>;</span></div></div><div><div><div>66</div></div><div><span><span>                    </span></span><span>i </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>67</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>68</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>69</div></div><div>
</div></div><div><div><div>70</div></div><div><span>            </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'D'</span><span>) {</span></div></div><div><div><div>71</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> </span><span>500</span><span>;</span></div></div><div><div><div>72</div></div><div><span><span>                </span></span><span>i </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>73</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>74</div></div><div>
</div></div><div><div><div>75</div></div><div><span>            </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'M'</span><span>) {</span></div></div><div><div><div>76</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> </span><span>1000</span><span>;</span></div></div><div><div><div>77</div></div><div><span><span>                </span></span><span>i </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>78</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>79</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>80</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>81</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>82</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>14. Longest Common Prefix<a href="#14-longest-common-prefix"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-common-prefix/" target="_blank">https://leetcode.com/problems/longest-common-prefix/</a></p><hr /><p>初始假定第一个词就是LCS。为了验证假设，我们需要逐个检查所有后续字符串，确定最开始的LCS也是后面字符串的前缀。如果不满足，则删掉LCS的最后一个字符。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>longestCommonPrefix</span><span>(</span><span>String</span><span><span>[] </span><span>strs</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (strs </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>strs</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// initialized as the first word of strs</span></div></div><div><div><div>8</div></div><div><span>        </span><span>String</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> strs[</span></span><span>0</span><span>];</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>strs</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>// keeps removing the last character until matching the common prefix requirement</span></div></div><div><div><div>12</div></div><div><span>            </span><span>while</span><span> (strs[i].</span><span>indexOf</span><span><span>(result) </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>result</span><span>.</span><span>substring</span><span>(</span><span>0</span><span>, </span><span>result</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>14</div></div><div><span>                </span><span>if</span><span> (</span><span>result</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>                    </span><span>break</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>15. 3Sum<a href="#15-3sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/3sum/" target="_blank">https://leetcode.com/problems/3sum/</a></p><hr /><p>先对数组进行排序，接着设立三个指针<code>first</code>, <code>second</code>, <code>third</code>。<code>first</code>负责从数组头遍历至数组尾，在每一次循环中固定<code>first</code>，移动头尾指针<code>two</code>和<code>third</code>，对<code>nums[first]</code>、<code>nums[second]</code>、<code>nums[third]</code>求和判断是否为0。</p><p>这题需要最大化利用排序带来的优势，缩短运行时间：</p><ul>
<li>检查最小/最大值，跳过一些不必要的检查</li>
<li>跳过相邻的重复元素</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>threeSum</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (len </span><span>&lt;</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// sort so we can use pointers to quickly sum</span></div></div><div><div><div>11</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(nums);</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// skip impossible cases</span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span> (</span><span>3</span><span><span> </span><span>*</span><span> nums[</span></span><span>0</span><span><span>] </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>3</span><span><span> </span><span>*</span><span> nums[len </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>first</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; first </span><span>&lt;</span><span> len </span><span>-</span><span> </span></span><span>2</span><span>; first++) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>// skip if nums[first] is duplicate</span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span><span> (first </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> nums[first] </span><span>==</span><span> nums[first</span><span>-</span></span><span>1</span><span>]) {</span></div></div><div><div><div>21</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>            </span><span>// too big, no need to check subsequent combinations</span></div></div><div><div><div>25</div></div><div><span>            </span><span>if</span><span> (</span><span>3</span><span><span> </span><span>*</span><span> nums[first] </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>            </span><span>// too small, we need to start from a larger nums[first]</span></div></div><div><div><div>30</div></div><div><span>            </span><span>if</span><span><span> (nums[first] </span><span>+</span><span> </span></span><span>2</span><span><span> </span><span>*</span><span> nums[len </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>31</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>            </span><span>int</span><span><span> </span><span>second</span><span> </span></span><span><span>=</span><span> first </span><span>+</span><span> </span></span><span>1</span><span><span>, third </span><span>=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>35</div></div><div><span>            </span><span>while</span><span><span> (second </span><span>&lt;</span><span> third) {</span></span></div></div><div><div><div>36</div></div><div><span>                </span><span>if</span><span><span> (nums[first] </span><span>+</span><span> nums[second] </span><span>+</span><span> nums[third] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>37</div></div><div><span>                    </span><span>result</span><span>.</span><span>add</span><span>(</span><span>Arrays</span><span>.</span><span>asList</span><span>(nums[first], nums[second], nums[third]));</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>                    </span><span>// skip nums[second] and nums[third] duplicates</span></div></div><div><div><div>40</div></div><div><span>                    </span><span>while</span><span><span> (second </span><span>&lt;</span><span> third </span><span>&amp;&amp;</span><span> nums[second] </span><span>==</span><span> nums[second </span><span>+</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>41</div></div><div><span><span>                        </span></span><span>second++;</span></div></div><div><div><div>42</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span>                    </span><span>while</span><span><span> (third </span><span>&gt;</span><span> second </span><span>&amp;&amp;</span><span> nums[third] </span><span>==</span><span> nums[third </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>44</div></div><div><span><span>                        </span></span><span>third--;</span></div></div><div><div><div>45</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>                    </span><span>// move pointers</span></div></div><div><div><div>48</div></div><div><span><span>                    </span></span><span>second++;</span></div></div><div><div><div>49</div></div><div><span><span>                    </span></span><span>third--;</span></div></div><div><div><div>50</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[first] </span><span>+</span><span> nums[second] </span><span>+</span><span> nums[third] </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>51</div></div><div><span><span>                    </span></span><span>second++;</span></div></div><div><div><div>52</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>53</div></div><div><span><span>                    </span></span><span>third--;</span></div></div><div><div><div>54</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>56</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>57</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>58</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>59</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>16. 3Sum Closest<a href="#16-3sum-closest"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/3sum-closest/" target="_blank">https://leetcode.com/problems/3sum-closest/</a></p><hr /><p>与前一题思路类似，只是将”等于“改成了”最接近于“。额外加一个变量<code>tempSum</code>用于存储当前最接近的和即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>threeSumClosest</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// less than three numbers, directly return all num's sum</span></div></div><div><div><div>10</div></div><div><span>        </span><span>if</span><span><span> (len </span><span>&lt;=</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> num;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// initialized as the sum of first three elements</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>result </span><span>=</span><span> nums[</span><span>0</span><span><span>] </span><span>+</span><span> nums[</span></span><span>1</span><span><span>] </span><span>+</span><span> nums[</span></span><span>2</span><span>];</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// sort so we can use pointers to quickly sum</span></div></div><div><div><div>21</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(nums);</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>first</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; first </span><span>&lt;</span><span> len </span><span>-</span><span> </span></span><span>2</span><span>; first++) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>// skip if nums[first] is duplicate</span></div></div><div><div><div>25</div></div><div><span>            </span><span>if</span><span><span> (first </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> nums[first] </span><span>==</span><span> nums[first </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>26</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>            </span><span>int</span><span><span> </span><span>second</span><span> </span></span><span><span>=</span><span> first </span><span>+</span><span> </span></span><span>1</span><span><span>, third </span><span>=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>30</div></div><div><span>            </span><span>while</span><span><span> (second </span><span>&lt;</span><span> third) {</span></span></div></div><div><div><div>31</div></div><div><span>                </span><span>int</span><span><span> </span><span>tempSum</span><span> </span></span><span><span>=</span><span> nums[first] </span><span>+</span><span> nums[second] </span><span>+</span><span> nums[third];</span></span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>                </span><span>// determine if tempSum is equal to target, or try to get tempSum closer to target</span></div></div><div><div><div>34</div></div><div><span>                </span><span>if</span><span><span> (tempSum </span><span>==</span><span> target) {</span></span></div></div><div><div><div>35</div></div><div><span>                    </span><span>return</span><span> tempSum;</span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (tempSum </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>37</div></div><div><span><span>                    </span></span><span>second++;</span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>39</div></div><div><span><span>                    </span></span><span>third--;</span></div></div><div><div><div>40</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>                </span><span>// update result</span></div></div><div><div><div>43</div></div><div><span>                </span><span>if</span><span> (</span><span>Math</span><span>.</span><span>abs</span><span><span>(target </span><span>-</span><span> result) </span><span>&gt;</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(target </span><span>-</span><span> tempSum)) {</span></span></div></div><div><div><div>44</div></div><div><span><span>                    </span></span><span>result </span><span>=</span><span> tempSum;</span></div></div><div><div><div>45</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>17. Letter Combinations of a Phone Number<a href="#17-letter-combinations-of-a-phone-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/letter-combinations-of-a-phone-number/" target="_blank">https://leetcode.com/problems/letter-combinations-of-a-phone-number/</a></p><hr /><p>设立一个字符串数组，数组下标0-9分别对应键盘0-9上的字符串。</p><p>遍历<code>digits</code>的每一位数字，得到这个数字可能对应的所有字母。使用回溯算法，尝试添加每一个字符，再通过深度优先思想添加下一个。以此类推，直到当前的string builder长度等于<code>digits</code>长度，表示发掘出了一种组合。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> result </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>final</span><span> </span><span>String</span><span>[] mapping </span><span><span>=</span><span> {</span></span><span>"0"</span><span><span>,</span><span> </span></span><span>"1"</span><span><span>,</span><span> </span></span><span>"abc"</span><span><span>,</span><span> </span></span><span>"def"</span><span><span>,</span><span> </span></span><span>"ghi"</span><span><span>,</span><span> </span></span><span>"jkl"</span><span><span>,</span><span> </span></span><span>"mno"</span><span><span>,</span><span> </span></span><span>"pqrs"</span><span><span>,</span><span> </span></span><span>"tuv"</span><span><span>,</span><span> </span></span><span>"wxyz"</span><span><span>}</span><span>;</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>letterCombinations</span><span>(</span><span>String</span><span><span> </span><span>digits</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (digits </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>digits</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>backtrack</span><span>(</span><span>new</span><span> </span><span>StringBuilder</span><span>(), digits, </span><span>0</span><span>);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>StringBuilder</span><span><span> </span><span>current</span><span>, </span></span><span>String</span><span><span> </span><span>digits</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>16</div></div><div><span>        </span><span>// find a combination, add to result</span></div></div><div><div><div>17</div></div><div><span>        </span><span>if</span><span> (</span><span>current</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>digits</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>current</span><span>.</span><span>toString</span><span>());</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// get all possible letters that are matching with current digit</span></div></div><div><div><div>23</div></div><div><span>        </span><span>int</span><span><span> </span><span>digit</span><span> </span></span><span><span>=</span><span> </span></span><span>digits</span><span>.</span><span>charAt</span><span><span>(index) </span><span>-</span><span> </span></span><span>'0'</span><span>;</span></div></div><div><div><div>24</div></div><div><span>        </span><span>String</span><span><span> </span><span>letters</span><span> </span></span><span><span>=</span><span> mapping[digit];</span></span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>letter</span></span><span>:</span><span> </span><span>letters</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>current</span><span>.</span><span>append</span><span>(letter);</span></div></div><div><div><div>28</div></div><div><span>            </span><span>backtrack</span><span><span>(current, digits, index </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>29</div></div><div><span>            </span><span>current</span><span>.</span><span>deleteCharAt</span><span>(</span><span>current</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>18. 4Sum<a href="#18-4sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/4sum/" target="_blank">https://leetcode.com/problems/4sum/</a></p><hr /><p>4Sum与3Sum的思路类似，仍然是使用多个指针的移动解决问题。使用<code>first</code>, <code>second</code>两个指针从头到尾遍历整个数组，而<code>third</code>, <code>fourth</code>两个指针则在<code>second</code>的后面，一前一后。</p><p>需要注意，在判断极值的时候可能会产生溢出，因此需要考虑int和long之间的转换。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>fourSum</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>if</span><span><span> (len </span><span>&lt;</span><span> </span></span><span>4</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// sort so we can use pointers to quickly sum</span></div></div><div><div><div>10</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(nums);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// too big or small</span></div></div><div><div><div>13</div></div><div><span>        </span><span>Long</span><span><span> </span><span>potentialMin</span><span> </span></span><span><span>=</span><span> (</span></span><span>long</span><span>)</span><span>4</span><span><span> </span><span>*</span><span> nums[</span></span><span>0</span><span>];</span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (potentialMin </span><span>&gt;</span><span> target) {</span></span></div></div><div><div><div>15</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>Long</span><span><span> </span><span>potentialMax</span><span> </span></span><span><span>=</span><span> (</span></span><span>long</span><span>)</span><span>4</span><span><span> </span><span>*</span><span> nums[len </span><span>-</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>19</div></div><div><span>        </span><span>if</span><span><span> (potentialMax </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>20</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>first</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; first </span><span>&lt;</span><span> len </span><span>-</span><span> </span></span><span>3</span><span>; first++) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>// skip if nums[first] is duplicate</span></div></div><div><div><div>25</div></div><div><span>            </span><span>if</span><span><span> (first </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> nums[first] </span><span>==</span><span> nums[first</span><span>-</span></span><span>1</span><span>]) {</span></div></div><div><div><div>26</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>            </span><span>// too big, no need to check subsequent combinations</span></div></div><div><div><div>30</div></div><div><span>            </span><span>Long</span><span><span> </span><span>potentialRestFourMin</span><span> </span></span><span><span>=</span><span> (</span></span><span>long</span><span>)</span><span>4</span><span><span> </span><span>*</span><span> nums[first];</span></span></div></div><div><div><div>31</div></div><div><span>            </span><span>if</span><span><span> (potentialRestFourMin </span><span>&gt;</span><span> target) {</span></span></div></div><div><div><div>32</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>            </span><span>// too small, we need to start from a larger nums[first]</span></div></div><div><div><div>36</div></div><div><span>            </span><span>Long</span><span><span> </span><span>potentialRestThreeMax</span><span> </span></span><span><span>=</span><span> (</span></span><span>long</span><span>)</span><span>3</span><span><span> </span><span>*</span><span> nums[len </span><span>-</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>37</div></div><div><span>            </span><span>if</span><span><span> (nums[first] </span><span>+</span><span> potentialRestThreeMax </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>38</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>second</span><span> </span></span><span><span>=</span><span> first </span><span>+</span><span> </span></span><span>1</span><span><span>; second </span><span>&lt;</span><span> len </span><span>-</span><span> </span></span><span>2</span><span>; second++) {</span></div></div><div><div><div>42</div></div><div><span>                </span><span>// skip if nums[first] is duplicate</span></div></div><div><div><div>43</div></div><div><span>                </span><span>if</span><span><span> (second </span><span>&gt;</span><span> first </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> nums[second] </span><span>==</span><span> nums[second </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>44</div></div><div><span>                    </span><span>continue</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>                </span><span>// too big, no need to check subsequent combinations</span></div></div><div><div><div>48</div></div><div><span>                </span><span>Long</span><span><span> </span><span>potentialRestThreeMin</span><span> </span></span><span><span>=</span><span> (</span></span><span>long</span><span>)</span><span>3</span><span><span> </span><span>*</span><span> nums[second];</span></span></div></div><div><div><div>49</div></div><div><span>                </span><span>if</span><span><span> (potentialRestThreeMin </span><span>+</span><span> nums[first] </span><span>&gt;</span><span> target) {</span></span></div></div><div><div><div>50</div></div><div><span>                    </span><span>break</span><span>;</span></div></div><div><div><div>51</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>52</div></div><div>
</div></div><div><div><div>53</div></div><div><span>                </span><span>// too small, we need to start from a larger nums[second]</span></div></div><div><div><div>54</div></div><div><span>                </span><span>if</span><span><span> (nums[first] </span><span>+</span><span> nums[second] </span><span>+</span><span> </span></span><span>2</span><span><span> </span><span>*</span><span> nums[len </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>55</div></div><div><span>                    </span><span>continue</span><span>;</span></div></div><div><div><div>56</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>57</div></div><div>
</div></div><div><div><div>58</div></div><div><span>                </span><span>int</span><span><span> </span><span>third</span><span> </span></span><span><span>=</span><span> second </span><span>+</span><span> </span></span><span>1</span><span><span>, fourth </span><span>=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>59</div></div><div><span>                </span><span>while</span><span><span> (third </span><span>&lt;</span><span> fourth) {</span></span></div></div><div><div><div>60</div></div><div><span>                    </span><span>if</span><span><span> (nums[first] </span><span>+</span><span> nums[second] </span><span>+</span><span> nums[third] </span><span>+</span><span> nums[fourth] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>61</div></div><div><span>                        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>Arrays</span><span>.</span><span>asList</span><span>(nums[first], nums[second], nums[third], nums[fourth]));</span></div></div><div><div><div>62</div></div><div>
</div></div><div><div><div>63</div></div><div><span>                        </span><span>// skip duplicates</span></div></div><div><div><div>64</div></div><div><span>                        </span><span>while</span><span><span> (second </span><span>&lt;</span><span> len </span><span>-</span><span> </span></span><span>2</span><span><span> </span><span>&amp;&amp;</span><span> nums[second] </span><span>==</span><span> nums[second </span><span>+</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>65</div></div><div><span><span>                            </span></span><span>second++;</span></div></div><div><div><div>66</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>67</div></div><div><span>                        </span><span>while</span><span><span> (third </span><span>&lt;</span><span> fourth </span><span>&amp;&amp;</span><span> nums[third] </span><span>==</span><span> nums[third </span><span>+</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>68</div></div><div><span><span>                            </span></span><span>third++;</span></div></div><div><div><div>69</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>70</div></div><div><span>                        </span><span>while</span><span><span> (third </span><span>&lt;</span><span> fourth </span><span>&amp;&amp;</span><span> nums[fourth] </span><span>==</span><span> nums[fourth </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>71</div></div><div><span><span>                            </span></span><span>fourth--;</span></div></div><div><div><div>72</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>73</div></div><div>
</div></div><div><div><div>74</div></div><div><span>                        </span><span>// move pointers</span></div></div><div><div><div>75</div></div><div><span><span>                        </span></span><span>third++;</span></div></div><div><div><div>76</div></div><div><span><span>                        </span></span><span>fourth--;</span></div></div><div><div><div>77</div></div><div><span><span>                    </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[first] </span><span>+</span><span> nums[second] </span><span>+</span><span> nums[third] </span><span>+</span><span> nums[fourth] </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>78</div></div><div><span><span>                        </span></span><span>third++;</span></div></div><div><div><div>79</div></div><div><span><span>                    </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>80</div></div><div><span><span>                        </span></span><span>fourth--;</span></div></div><div><div><div>81</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>82</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>83</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>84</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>85</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>86</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>87</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>19. Remove Nth Node From End of List<a href="#19-remove-nth-node-from-end-of-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/remove-nth-node-from-end-of-list/" target="_blank">https://leetcode.com/problems/remove-nth-node-from-end-of-list/</a></p><hr /><p>引入两个指针，一快一慢，二者之间的下标差为<code>n</code>（即<code>slow</code>指针指向第1个元素，则<code>fast</code>指针指向第<code>n+1</code>个元素）。删除节点则只需要调整节点的<code>next</code>指针即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>removeNthFromEnd</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>dummyHead</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>14</div></div><div><span>        </span><span>dummyHead</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> head;</span></span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// slow and fast pointers</span></div></div><div><div><div>17</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>slow</span><span> </span></span><span><span>=</span><span> dummyHead, fast </span><span>=</span><span> dummyHead;</span></span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>// fast moves n steps ahead</span></div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>fast </span><span>=</span><span> </span><span>fast</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// move slow and fast together</span></div></div><div><div><div>25</div></div><div><span>        </span><span>while</span><span> (</span><span>fast</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>slow </span><span>=</span><span> </span><span>slow</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>fast </span><span>=</span><span> </span><span>fast</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// delete nth node</span></div></div><div><div><div>31</div></div><div><span>        </span><span>slow</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>slow</span><span>.</span><span>next</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span> </span><span>dummyHead</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>20. Valid Parentheses<a href="#20-valid-parentheses"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/valid-parentheses/" target="_blank">https://leetcode.com/problems/valid-parentheses/</a></p><hr /><p>利用栈的特性，如果遇到左半侧的括号则推入栈中，右半侧的括号则检查是否与当前栈顶元素配对，如果不能配对就返回false，否则配对成功就把栈顶括号弹出。最后确认栈是否为空。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isValid</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>Character</span><span><span>&gt; </span><span>st</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;&gt;();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>            </span><span>// push all left parentheses into stack</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'('</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'['</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'{'</span><span>) {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>st</span><span>.</span><span>push</span><span>(c);</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>')'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>']'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'}'</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>// current right parenthesis must match with top parenthesis in the stack</span></div></div><div><div><div>16</div></div><div><span>                </span><span>if</span><span> (</span><span>st</span><span>.</span><span>size</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>17</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>                </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>')'</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>st</span><span>.</span><span>peek</span><span><span>() </span><span>!=</span><span> </span></span><span>'('</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>']'</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>st</span><span>.</span><span>peek</span><span><span>() </span><span>!=</span><span> </span></span><span>'['</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'}'</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>st</span><span>.</span><span>peek</span><span><span>() </span><span>!=</span><span> </span></span><span>'{'</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>27</div></div><div><span>                    </span><span>// successfully matched, pop the top parenthesis</span></div></div><div><div><div>28</div></div><div><span>                    </span><span>st</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>        </span><span>return</span><span> </span><span>st</span><span>.</span><span>isEmpty</span><span>();</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>21. Merge Two Sorted Lists<a href="#21-merge-two-sorted-lists"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/merge-two-sorted-lists/" target="_blank">https://leetcode.com/problems/merge-two-sorted-lists/</a></p><hr /><p>第一种方法，比较<code>l1</code>和<code>l2</code>上的指针当前指向的元素，取较小元素之后的子链表和另一个链表继续进行递归合并。这样能保证每一次比较都优先提取出两个剩余链表的最小值，其余部分的结果也会接在这个最小值之后。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>mergeTwoLists</span><span>(</span><span>ListNode</span><span><span> </span><span>l1</span><span>, </span></span><span>ListNode</span><span><span> </span><span>l2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (l1 </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> l2;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span><span> (l2 </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>return</span><span> l1;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// merge after smaller node</span></div></div><div><div><div>21</div></div><div><span>        </span><span>if</span><span> (</span><span>l1</span><span>.</span><span>val</span><span><span> </span><span>&lt;</span><span> </span></span><span>l2</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>l1</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>mergeTwoLists</span><span>(</span><span>l1</span><span>.</span><span>next</span><span>, l2);</span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span> l1;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>l2</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>mergeTwoLists</span><span>(l1, </span><span>l2</span><span>.</span><span>next</span><span>);</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span> l2;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>第二种方法，也是比较<code>l1</code>和<code>l2</code>上的指针当前指向的元素，但不使用递归，而是直接根据大小关系决定排列顺序。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>mergeTwoLists</span><span>(</span><span>ListNode</span><span><span> </span><span>l1</span><span>, </span></span><span>ListNode</span><span><span> </span><span>l2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (l1 </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> l2;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span><span> (l2 </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>return</span><span> l1;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>dummyHead</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>21</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> dummyHead;</span></span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>while</span><span><span> (l1 </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> l2 </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>// decide which element to be added to the result list</span></div></div><div><div><div>25</div></div><div><span>            </span><span>if</span><span> (</span><span>l1</span><span>.</span><span>val</span><span><span> </span><span>&lt;</span><span> </span></span><span>l2</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>                </span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> l1;</span></span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>l1 </span><span>=</span><span> </span><span>l1</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>29</div></div><div><span>                </span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> l2;</span></span></div></div><div><div><div>30</div></div><div><span><span>                </span></span><span>l2 </span><span>=</span><span> </span><span>l2</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>// one list reaches the end, add the rest list elements to result</span></div></div><div><div><div>36</div></div><div><span>        </span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> (l2 </span><span>==</span><span> </span></span><span>null</span><span>) </span><span>?</span><span> l1 </span><span>:</span><span> l2;</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> </span><span>dummyHead</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>22. Generate Parentheses<a href="#22-generate-parentheses"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/generate-parentheses/" target="_blank">https://leetcode.com/problems/generate-parentheses/</a></p><hr /><p>使用递归策略，优先构造左括号，当左括号个数大于右括号时再构造右括号。</p><p>具体代码实现时，可以使用两个变量<code>left</code>，<code>right</code>跟踪当前左、右括号数量，在递归中将它们与<code>n</code>进行比较。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> result </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>generateParenthesis</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>generate</span><span>(</span><span>""</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, n);</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>// left: left parentheses' count</span></div></div><div><div><div>10</div></div><div><span>    </span><span>// right: right parentheses' count</span></div></div><div><div><div>11</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>generate</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>int</span><span><span> </span><span>left</span><span>, </span></span><span>int</span><span><span> </span><span>right</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>if</span><span><span> (right </span><span>==</span><span> n) {</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>// finish construction</span></div></div><div><div><div>14</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(s);</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>// always prefer to generate left parenthesis first</span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span><span> (left </span><span>&lt;</span><span> n) {</span></span></div></div><div><div><div>18</div></div><div><span>                </span><span>generate</span><span><span>(s </span><span>+</span><span> </span></span><span>"("</span><span><span>, left </span><span>+</span><span> </span></span><span>1</span><span>, right, n);</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>// left is greater than right, then generate a right parenthesis</span></div></div><div><div><div>22</div></div><div><span>            </span><span>if</span><span><span> (left </span><span>&gt;</span><span> right) {</span></span></div></div><div><div><div>23</div></div><div><span>                </span><span>generate</span><span><span>(s </span><span>+</span><span> </span></span><span>")"</span><span><span>, left, right </span><span>+</span><span> </span></span><span>1</span><span>, n);</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>23. Merge k Sorted Lists<a href="#23-merge-k-sorted-lists"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/merge-k-sorted-lists/" target="_blank">https://leetcode.com/problems/merge-k-sorted-lists/</a></p><hr /><p>第一种解法是使用优先队列。优先队列本质上是一种堆，具体使用时可以自定义comparator指定最小堆或是最大堆。由于此题要求从小到大排序，因此需要定义最小堆。</p><p>将每一条链表的头元素加入优先队列中。优先级最高的元素就是这些元素里的最小值。将其排序后进行判断，如果该元素的next指针不指向空，则将剩下的链表头元素重新插入优先队列中。</p><p>以一个形象一些的方式描述该场景：一位教师正在向一群排队的学生解答问题，每个学生都有多个问题，并且问题的难度有难有易，教师优先回答简单的问题。为保证公平，当前问问题的学生问完一个问题后需要重新排队，排队顺序取决于他下一个问题的难度。</p><p>时间复杂度上，如果链表有<code>N</code>个节点，则堆的插入、删除操作时间复杂度均为<code>O(logN)</code>，总的时间复杂度为<code>O(NlogN)</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>mergeKLists</span><span>(</span><span>ListNode</span><span><span>[] </span><span>lists</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (lists </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>lists</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// override priority queue's comparator in ascending order</span></div></div><div><div><div>18</div></div><div><span>        </span><span>Queue</span><span>&lt;</span><span>ListNode</span><span><span>&gt; </span><span>pq</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;&gt;((</span><span>ListNode</span><span> l1, </span><span>ListNode</span><span> l2) </span><span>-&gt;</span><span> {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>l1</span><span>.</span><span>val</span><span><span> </span><span>-</span><span> </span></span><span>l2</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>});</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// add each list's head (smallest) node into the priority queue</span></div></div><div><div><div>23</div></div><div><span>        </span><span>for</span><span> (</span><span>ListNode</span><span><span> </span><span>list</span><span> </span></span><span>:</span><span> lists) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>if</span><span><span> (list </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>                </span><span>pq</span><span>.</span><span>offer</span><span>(list);</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>dummyHead</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>30</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> dummyHead;</span></span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>pq</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>33</div></div><div><span>            </span><span>// pick out the smallest element from priority queue</span></div></div><div><div><div>34</div></div><div><span>            </span><span>ListNode</span><span><span> </span><span>currentHead</span><span> </span></span><span><span>=</span><span> </span></span><span>pq</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>35</div></div><div><span>            </span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> currentHead;</span></span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>            </span><span>// add its next element into the queue</span></div></div><div><div><div>39</div></div><div><span>            </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>40</div></div><div><span>                </span><span>pq</span><span>.</span><span>offer</span><span>(</span><span>cur</span><span>.</span><span>next</span><span>);</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>        </span><span>return</span><span> </span><span>dummyHead</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>第二种解法是使用分治策略，将<code>k</code>条链表对半分为两组，问题转化为了广义版的merge two sorted lists问题。不断从上而下划分，再由小到大不断两两合并，得到完整的链表。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>mergeKLists</span><span>(</span><span>ListNode</span><span><span>[] </span><span>lists</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span> </span><span>merge</span><span>(lists, </span><span>0</span><span>, </span><span>lists</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span>private</span><span> </span><span>ListNode</span><span> </span><span>merge</span><span>(</span><span>ListNode</span><span><span>[] </span><span>lists</span><span>, </span></span><span>int</span><span><span> </span><span>l</span><span>, </span></span><span>int</span><span><span> </span><span>r</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>17</div></div><div><span>        </span><span>// invalid interval</span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (l </span><span>&gt;</span><span> r) {</span></span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// interval only has one list group</span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span><span> (l </span><span>==</span><span> r) {</span></span></div></div><div><div><div>24</div></div><div><span>            </span><span>return</span><span> lists[l];</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>// divide k lists into two groups</span></div></div><div><div><div>28</div></div><div><span>        </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> l </span><span>+</span><span> (r </span><span>-</span><span> l) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>29</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>merge</span><span>(lists, l, mid);</span></div></div><div><div><div>30</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>merge</span><span><span>(lists, mid </span><span>+</span><span> </span></span><span>1</span><span>, r);</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>// merge two "big" lists together</span></div></div><div><div><div>33</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>dummyHead</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>34</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> dummyHead;</span></span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> right </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>37</div></div><div><span>            </span><span>// right list is null, or the head of left list is smaller than the one of right list</span></div></div><div><div><div>38</div></div><div><span>            </span><span>if</span><span><span> (right </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> (left </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>left</span><span>.</span><span>val</span><span><span> </span><span>&lt;</span><span> </span></span><span>right</span><span>.</span><span>val</span><span>)) {</span></div></div><div><div><div>39</div></div><div><span>                </span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> left;</span></span></div></div><div><div><div>40</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> </span><span>left</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>42</div></div><div><span>                </span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> right;</span></span></div></div><div><div><div>43</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> </span><span>right</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span>        </span><span>return</span><span> </span><span>dummyHead</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>49</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>24. Swap Nodes in Pairs<a href="#24-swap-nodes-in-pairs"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/swap-nodes-in-pairs/" target="_blank">https://leetcode.com/problems/swap-nodes-in-pairs/</a></p><hr /><p>使用递归，只提取前两个节点，将剩余节点视为一个整体。</p><p>新的头节点<code>newHead</code>是原来的第二个节点<code>head.next</code>，而原来的头节点<code>head</code>指向剩余节点整体（剩余部分的头节点为<code>head.next.next</code>）。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>swapPairs</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>head</span><span>.</span><span>next</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> head;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// previous second node now bcomes the head node</span></div></div><div><div><div>18</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>newHead</span><span> </span></span><span><span>=</span><span> </span></span><span>head</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// regard all other nodes as an entity, and the head of this entity is head.next.next</span></div></div><div><div><div>21</div></div><div><span>        </span><span>head</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>swapPairs</span><span>(</span><span>head</span><span>.</span><span>next</span><span>.</span><span>next</span><span>);</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>// previous head node now becomes the second node</span></div></div><div><div><div>24</div></div><div><span>        </span><span>newHead</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> head;</span></span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> newHead;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>25. Reverse Nodes in k-Group<a href="#25-reverse-nodes-in-k-group"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reverse-nodes-in-k-group/" target="_blank">https://leetcode.com/problems/reverse-nodes-in-k-group/</a></p><hr /><p>假设遍历链表的指针为<code>cur</code>，将<code>cur</code>移动<code>k</code>个节点，获取到<code>k</code>个节点就能组成一个节点簇。我们优先递归完成链表后续部分的反转，再来倒转节点簇的<code>k</code>个节点。每个节点簇内，我们的核心思想是把原先的第一个节点指向链表后续部分，这样一来这个节点就可以被归到已经逆序的子链表中；而原先节点簇的第二个节点就成为了剩余未逆序部分的头节点。我们需要不断循环<code>k</code>次，按照上述流程调整顺序。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>reverseKGroup</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// move cur k nodes forward</span></div></div><div><div><div>18</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> head;</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span>        </span><span>while</span><span><span> (cur </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> count </span><span>!=</span><span> k) {</span></span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>count++;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>// we get k nodes in a group now</span></div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span><span> (count </span><span>==</span><span> k) {</span></span></div></div><div><div><div>27</div></div><div><span>            </span><span>// recursively complete all other nodes first to get the modified sub-list</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>reverseKGroup</span><span>(cur, k);</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>// reverse k nodes</span></div></div><div><div><div>31</div></div><div><span>            </span><span>while</span><span><span> (count-- </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>32</div></div><div><span>                </span><span>// get the second element among k nodes</span></div></div><div><div><div>33</div></div><div><span>                </span><span>ListNode</span><span><span> </span><span>second</span><span> </span></span><span><span>=</span><span> </span></span><span>head</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>                </span><span>// current first element (head) will point to the modified sub-list</span></div></div><div><div><div>36</div></div><div><span>                </span><span>head</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> cur;</span></span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>                </span><span>// previous head has become the head of the modified sub-list</span></div></div><div><div><div>39</div></div><div><span><span>                </span></span><span>cur </span><span>=</span><span> head;</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>                </span><span>// previous second element now becomes the new head of the un-reversed part</span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>head </span><span>=</span><span> second;</span></div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span>            </span><span>// after reverse, the head of the modified sub-list is actually the head of the whole list</span></div></div><div><div><div>46</div></div><div><span><span>            </span></span><span>head </span><span>=</span><span> cur;</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>        </span><span>return</span><span> head;</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>26. Remove Duplicates from Sorted Array<a href="#26-remove-duplicates-from-sorted-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/remove-duplicates-from-sorted-array/" target="_blank">https://leetcode.com/problems/remove-duplicates-from-sorted-array/</a></p><hr /><p>从头开始遍历，只要遇到不重复的数时，就覆盖数组的原始值。最后返回的<code>result</code>值实际上就是不同数字的个数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>removeDuplicates</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (len </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> len;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span><span> (nums[i] </span><span>!=</span><span> nums[i </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>nums[result] </span><span>=</span><span> nums[i]; </span><span>// in-place modification</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>result++;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>27. Remove Element<a href="#27-remove-element"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/remove-element/" target="_blank">https://leetcode.com/problems/remove-element/</a></p><hr /><p>与上一题一样的思路，遇到值为<code>val</code>的元素时跳过，其余仍从头到尾开始覆盖。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>removeElement</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span><span> (nums[i] </span><span>!=</span><span> val) {</span></span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>nums[result] </span><span>=</span><span> nums[i]; </span><span>// in-place modification</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>result++;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>28. Implement strStr()<a href="#28-implement-strstr"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/implement-strstr/" target="_blank">https://leetcode.com/problems/implement-strstr/</a></p><hr /><p>遍历<code>haystack</code>中的每一个字符，如果某个字符与<code>needle</code>的首字符相同，再检查<code>haystack</code>中该字符起的子串是否与<code>needle</code>的值相同。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>strStr</span><span>(</span><span>String</span><span><span> </span><span>haystack</span><span>, </span></span><span>String</span><span><span> </span><span>needle</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>hLen</span><span> </span></span><span><span>=</span><span> </span></span><span>haystack</span><span>.</span><span>length</span><span><span>(), nLen </span><span>=</span><span> </span></span><span>needle</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// needle is an empty string</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (nLen </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// haystack is empty and impossible to contain needle</span></div></div><div><div><div>11</div></div><div><span>        </span><span>if</span><span><span> (hLen </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;=</span><span> hLen </span><span>-</span><span> nLen; i++) {</span></span></div></div><div><div><div>16</div></div><div><span>            </span><span>// current char is equal to needle's first char &amp; substring is equal to needle</span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span> (</span><span>haystack</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>needle</span><span>.</span><span>charAt</span><span>(</span><span>0</span><span><span>) </span><span>&amp;&amp;</span><span> </span></span><span>haystack</span><span>.</span><span>substring</span><span><span>(i, i </span><span>+</span><span> nLen).</span></span><span>equals</span><span>(needle)) {</span></div></div><div><div><div>18</div></div><div><span>                </span><span>return</span><span> i;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>29. Divide Two Integers<a href="#29-divide-two-integers"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/divide-two-integers/" target="_blank">https://leetcode.com/problems/divide-two-integers/</a></p><hr /><p>此题要求实现除法，并且不能使用乘、除、取模三个符号。大致的思路流程是：</p><ol>
<li>专门处理被除数为<code>Integer.MIN_VALUE</code>，<code>divisor</code>为-1时的情况，这种时候int形式的结果会发生溢出</li>
<li>将<code>dividend</code>和<code>divisor</code>都取绝对值</li>
<li>使用指数倍增思想，快速寻找到<code>dividend</code>中至少包含几个<code>divisor</code>。</li>
<li>决定最终结果的实际符号</li>
</ol><p>为了避免溢出，在第一步处理完特例后，我们最好将<code>dividend</code>和<code>divisor</code>都转为long格式。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>divide</span><span>(</span><span>int</span><span><span> </span><span>dividend</span><span>, </span></span><span>int</span><span><span> </span><span>divisor</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// corner case</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (dividend </span><span>==</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span><span> </span><span>&amp;&amp;</span><span> divisor </span><span>==</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> </span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>long</span><span><span> </span><span>dividendCopy</span><span> </span></span><span><span>=</span><span> (</span></span><span>long</span><span><span>)dividend, divisorCopy </span><span>=</span><span> (</span></span><span>long</span><span>)divisor;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// get rid of sign</span></div></div><div><div><div>11</div></div><div><span>        </span><span>long</span><span><span> </span><span>a</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(dividendCopy), b </span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span>(divisorCopy);</span></div></div><div><div><div>12</div></div><div><span>        </span><span>long</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>while</span><span><span> (a </span><span>&gt;=</span><span> b) {</span></span></div></div><div><div><div>15</div></div><div><span>            </span><span>int</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>// count how many divisor does the dividend "has"</span></div></div><div><div><div>18</div></div><div><span>            </span><span>while</span><span><span> (a </span><span>&gt;=</span><span> (b </span><span>&lt;&lt;</span><span> </span></span><span>1</span><span><span> </span><span>&lt;&lt;</span><span> x)) {</span></span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>x++;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> </span><span>1</span><span><span> </span><span>&lt;&lt;</span><span> x;</span></span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>a </span><span>-=</span><span> b </span><span>&lt;&lt;</span><span> x;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>// determine if dividend and divisor have same sign</span></div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span><span> (dividend </span><span>&gt;</span><span> </span></span><span>0</span><span><span>) </span><span>==</span><span> (divisor </span><span>&gt;</span><span> </span></span><span>0</span><span>) </span><span>?</span><span> (</span><span>int</span><span>)result </span><span>:</span><span> (</span><span>int</span><span><span>)</span><span>-</span><span>result;</span></span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>30. Substring with Concatenation of All Words<a href="#30-substring-with-concatenation-of-all-words"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/substring-with-concatenation-of-all-words/" target="_blank">https://leetcode.com/problems/substring-with-concatenation-of-all-words/</a></p><hr /><p>只要<code>words</code>中的所有单词拼接得到<code>s</code>中的子字符串即可满足题意，单词的顺序并不重要。因此我们只需要关注<code>words</code>中每一个单词出现的次数。</p><p>此题可以使用两个HashMap解决，一个HashMap用于记录<code>words</code>数组中的每一个单词出现的次数；另一个HashMap用于记录当前遍历<code>s</code>时的单词已经出现了几次。如果当前遍历的单词是<code>words</code>中没有的，或者出现次数已经超过了“应该”出现的次数，则说明不满足题意。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>findSubstring</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>String</span><span><span>[] </span><span>words</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span> (</span><span>words</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// how many times each word is supposed to occur</span></div></div><div><div><div>9</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>String</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>expected</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>word</span><span> </span></span><span>:</span><span> words) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>expected</span><span>.</span><span>put</span><span>(word, </span><span>expected</span><span>.</span><span>getOrDefault</span><span>(word, </span><span>0</span><span><span>) </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>// each word's length and all words' count</span></div></div><div><div><div>15</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> words[</span></span><span>0</span><span>].</span><span>length</span><span><span>(), count </span><span>=</span><span> </span></span><span>words</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&lt;</span><span> count </span><span>*</span><span> len) {</span></span></div></div><div><div><div>17</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>21</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i; j </span><span>&lt;=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> count </span><span>*</span><span> len; j </span><span>+=</span><span> len) {</span></span></div></div><div><div><div>22</div></div><div><span>                </span><span>// how many times every word actually occurs in each substring</span></div></div><div><div><div>23</div></div><div><span>                </span><span>Map</span><span>&lt;</span><span>String</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>actual</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>                </span><span>// iterate from the last</span></div></div><div><div><div>26</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> count </span><span>-</span><span> </span></span><span>1</span><span><span>; k </span><span>&gt;=</span><span> </span></span><span>0</span><span>; k--) {</span></div></div><div><div><div>27</div></div><div><span>                    </span><span>// extract current word</span></div></div><div><div><div>28</div></div><div><span>                    </span><span>String</span><span><span> </span><span>currentWord</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>substring</span><span><span>(j </span><span>+</span><span> k </span><span>*</span><span> len, j </span><span>+</span><span> (k </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>*</span><span> len);</span></span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>                    </span><span>// current word is not supposed to occur</span></div></div><div><div><div>31</div></div><div><span>                    </span><span>if</span><span><span> (</span><span>!</span></span><span>expected</span><span>.</span><span>containsKey</span><span>(currentWord)) {</span></div></div><div><div><div>32</div></div><div><span>                        </span><span>break</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>                    </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>34</div></div><div><span>                        </span><span>int</span><span><span> </span><span>occurences</span><span> </span></span><span><span>=</span><span> </span></span><span>actual</span><span>.</span><span>getOrDefault</span><span>(currentWord, </span><span>0</span><span><span>) </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>                        </span><span>// can not exceed expected occurences</span></div></div><div><div><div>37</div></div><div><span>                        </span><span>if</span><span><span> (occurences </span><span>&gt;</span><span> </span></span><span>expected</span><span>.</span><span>get</span><span>(currentWord)) {</span></div></div><div><div><div>38</div></div><div><span>                            </span><span>// start right after invalid occurence, as previous choices will include invalid.</span></div></div><div><div><div>39</div></div><div><span><span>                            </span></span><span>j </span><span>+=</span><span> k </span><span>*</span><span> len;</span></div></div><div><div><div>40</div></div><div><span>                            </span><span>break</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>                        </span><span>actual</span><span>.</span><span>put</span><span>(currentWord, occurences);</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span>                        </span><span>// all words appear</span></div></div><div><div><div>46</div></div><div><span>                        </span><span>if</span><span><span> (k </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>47</div></div><div><span>                            </span><span>result</span><span>.</span><span>add</span><span>(j);</span></div></div><div><div><div>48</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>52</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>54</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>31. Next Permutation<a href="#31-next-permutation"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/next-permutation/" target="_blank">https://leetcode.com/problems/next-permutation/</a></p><hr /><p>一个数组向下一置换演变的趋势总体是从升序演变为降序。</p><p>找到下一置换，实际上就是从右到左遍历，先找到破坏升序的第一个数<code>nums[i]</code>，再从这个数的右侧（也是从右向左遍历）找到第一个比<code>nums[i]</code>大的数<code>nums[j]</code>，这两个数进行交换。最后，对下标<code>i</code>之后的数需要全部进行反转，因为在经过交换之后，从下标<code>i</code>开始一直到结尾都是降序，我们需要将<code>i + 1</code>到结尾重新调整为升序，确保不遗漏置换的可能。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>nextPermutation</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// search from right to left and find the first element to break the ascending order</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> nums[i] </span><span>&gt;=</span><span> nums[i</span><span>+</span></span><span>1</span><span>]) {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>i--;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// if there is an element that break the ascending order</span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (i </span><span>&gt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>// find the rightmost element which is larger than nums[i]</span></div></div><div><div><div>18</div></div><div><span>            </span><span>while</span><span><span> (nums[i] </span><span>&gt;=</span><span> nums[j]) {</span></span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>j--;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>// swap nums[i] and nums[j]</span></div></div><div><div><div>23</div></div><div><span>            </span><span>swap</span><span>(nums, i, j);</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>        </span><span>// reverse all elements after index i</span></div></div><div><div><div>26</div></div><div><span>        </span><span>reverseArray</span><span><span>(nums, i </span><span>+</span><span> </span></span><span>1</span><span>, </span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>    </span><span>// swap two nums</span></div></div><div><div><div>30</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>swap</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> nums[i];</span></span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>nums[i] </span><span>=</span><span> nums[j];</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>nums[j] </span><span>=</span><span> temp;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>    </span><span>// reverse part of the array</span></div></div><div><div><div>37</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>reverseArray</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>38</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> j) {</span></span></div></div><div><div><div>39</div></div><div><span>            </span><span>swap</span><span>(nums, i++, j--);</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>32. Longest Valid Parentheses<a href="#32-longest-valid-parentheses"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-valid-parentheses/" target="_blank">https://leetcode.com/problems/longest-valid-parentheses/</a></p><hr /><p>使用栈解决。遍历字符串，如果遇到’(‘，则将当前下标推入栈中；遇到’)‘，则将栈顶下标弹出，并讨论。需要注意：</p><ul>
<li>栈里存储的下标，实质上指的是“截止到这个下标时，字符串不能组成valid parentheses”。我们最后更新结果时，也是用当前下标与栈顶下标的差值来更新长度，因为这一段差值之间的字符串一定是有效的</li>
<li>因为上述设定，栈的初始化需要push一个-1；如果空栈的时候，说明截止至目前的字符串一定是无效的，我们要想找有效字符串只能在此之后寻找</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>longestValidParentheses</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>ArrayDeque</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>stack</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayDeque</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// the index preceding to potential start of valid parentheses</span></div></div><div><div><div>8</div></div><div><span>        </span><span>stack</span><span>.</span><span>push</span><span><span>(</span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>char</span><span><span> </span><span>curr</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (curr </span><span>==</span><span> </span></span><span>'('</span><span>) {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>stack</span><span>.</span><span>push</span><span>(i);</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>// no matter we get valid parentheses or not, we need to pop here</span></div></div><div><div><div>16</div></div><div><span>                </span><span>// if valid, we need to get last index to calculate diff</span></div></div><div><div><div>17</div></div><div><span>                </span><span>// if unvalid, we update with current index</span></div></div><div><div><div>18</div></div><div><span>                </span><span>stack</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>                </span><span>if</span><span> (</span><span>stack</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>21</div></div><div><span>                    </span><span>// the stack is empty only if we have an extra ')'. Any further extensions of valid parentheses is impossible</span></div></div><div><div><div>22</div></div><div><span>                    </span><span>// push current index, since it is preceding to potential start of valid parentheses</span></div></div><div><div><div>23</div></div><div><span>                    </span><span>stack</span><span>.</span><span>push</span><span>(i);</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>25</div></div><div><span>                    </span><span>// this may be our longest valid parentheses</span></div></div><div><div><div>26</div></div><div><span><span>                    </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, i </span><span>-</span><span> </span></span><span>stack</span><span>.</span><span>peek</span><span>());</span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>33. Search in Rotated Sorted Array<a href="#33-search-in-rotated-sorted-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/search-in-rotated-sorted-array/" target="_blank">https://leetcode.com/problems/search-in-rotated-sorted-array/</a></p><hr /><p>这一题需要将数组对半划分来看，其中一半一定是有序的，而另一半则在中间某处破坏了升序。因此在使用模型1时，我们无法简单通过比较<code>nums[mid]</code>和<code>target</code>确定下一轮搜索区间，而是应该比较<code>nums[left]</code>、<code>nums[mid]</code>和<code>nums[right]</code>三者的值，先判断哪一半数组是有序的；之后将<code>target</code>放进有序的这一侧进行比较，如果<code>target</code>的值介于其中则把区间定为有序的这一侧，反之定为另一侧。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>search</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>            </span><span>// nums[mid] matches with target, return</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (nums[mid] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>13</div></div><div><span>                </span><span>return</span><span> mid;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>// left half is ordered</span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span><span> (nums[left] </span><span>&lt;=</span><span> nums[mid]) {</span></span></div></div><div><div><div>18</div></div><div><span>                </span><span>// target is in left half</span></div></div><div><div><div>19</div></div><div><span>                </span><span>if</span><span><span> (target </span><span>&gt;=</span><span> nums[left] </span><span>&amp;&amp;</span><span> target </span><span>&lt;=</span><span> nums[mid]) {</span></span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>22</div></div><div><span><span>                    </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>            </span><span>// right half is ordered</span></div></div><div><div><div>27</div></div><div><span>            </span><span>if</span><span><span> (nums[mid] </span><span>&lt;=</span><span> nums[right]) {</span></span></div></div><div><div><div>28</div></div><div><span>                </span><span>// target is in right half</span></div></div><div><div><div>29</div></div><div><span>                </span><span>if</span><span><span> (target </span><span>&gt;=</span><span> nums[mid] </span><span>&amp;&amp;</span><span> target </span><span>&lt;=</span><span> nums[right]) {</span></span></div></div><div><div><div>30</div></div><div><span><span>                    </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>32</div></div><div><span><span>                    </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>34. Find First and Last Position of Element in Sorted Array<a href="#34-find-first-and-last-position-of-element-in-sorted-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/" target="_blank">https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/</a></p><hr /><p>分别进行左边界搜索和右边界搜索即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>searchRange</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[] {</span><span>-</span></span><span>1</span><span><span>, </span><span>-</span></span><span>1</span><span>};</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// left</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>11</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (nums[mid] </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[mid] </span><span>&gt;=</span><span> target) {</span></span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>if</span><span><span> (left </span><span>!=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> nums[left] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>result[</span><span>0</span><span><span>] </span><span>=</span><span> left;</span></span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>// right</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>left </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>right </span><span>=</span><span> </span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>26</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>27</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>28</div></div><div><span>            </span><span>if</span><span><span> (nums[mid] </span><span>&lt;=</span><span> target) {</span></span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[mid] </span><span>&gt;</span><span> target) {</span></span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>if</span><span><span> (left </span><span>!=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> nums[left </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>result[</span><span>1</span><span><span>] </span><span>=</span><span> left </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>35. Search Insert Position<a href="#35-search-insert-position"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/search-insert-position/" target="_blank">https://leetcode.com/problems/search-insert-position/</a></p><hr /><p>可以假想把<code>target</code>插入到<code>nums</code>数组中，再转化为数组长度+1后的标准二分查找。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>searchInsert</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// num's length +1, therefore right should be 'nums.length' instead of 'nums.length - 1'</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// standard binary search</span></div></div><div><div><div>11</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span><span> (nums[mid] </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// both left and right are valid</span></div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> left;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>36. Valid Sudoku<a href="#36-valid-sudoku"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/valid-sudoku/" target="_blank">https://leetcode.com/problems/valid-sudoku/</a></p><hr /><p>每一个数字只能在所处的行、列、3*3方格内出现一次。因此，构造三个二维数组检查当前数字num分别在当前行、列、方格内出现的次数，超过1次就是不合法的。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isValidSudoku</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>9</span><span>][</span><span>9</span><span>]; </span><span>// row[i][num] indicates the count of 'num' in the i-th row</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>col</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>9</span><span>][</span><span>9</span><span>]; </span><span>// col[j][num] indicates the count of 'num' in the j-th column</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>block</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>9</span><span>][</span><span>9</span><span>]; </span><span>// block[k][num] indicates the count of 'num' in the k-th 3*3 block</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>9</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>9</span><span>; j++) {</span></div></div><div><div><div>9</div></div><div><span>                </span><span>// only validate filled cells</span></div></div><div><div><div>10</div></div><div><span>                </span><span>if</span><span><span> (board[i][j] </span><span>!=</span><span> </span></span><span>'.'</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>                    </span><span>int</span><span><span> </span><span>num</span><span> </span></span><span><span>=</span><span> board[i][j] </span><span>-</span><span> </span></span><span>'1'</span><span>;</span></div></div><div><div><div>12</div></div><div><span>                    </span><span>int</span><span><span> </span><span>blockIndex</span><span> </span></span><span><span>=</span><span> (i</span><span>/</span></span><span>3</span><span><span>) </span><span>*</span><span> </span></span><span>3</span><span><span> </span><span>+</span><span> j</span><span>/</span></span><span>3</span><span>;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>                    </span><span>// each num should not duplicate in each row, col, block</span></div></div><div><div><div>15</div></div><div><span>                    </span><span>if</span><span><span> (row[i][num] </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> col[j][num] </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> block[blockIndex][num] </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>                        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span><span>                    </span></span><span>row[i][num] </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>col[j][num] </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>                    </span></span><span>block[blockIndex][num] </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>37. Sudoku Solver<a href="#37-sudoku-solver"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sudoku-solver/" target="_blank">https://leetcode.com/problems/sudoku-solver/</a></p><hr /><p>遇到一个空方格，从0-9循环填入每一个数字，填完后确认没有违规，再以深度优先，尝试后续所有方格都满足要求，才能保证当前方格也满足要求。</p><p>遇到列尾时跳下一行，遇到行尾则说明深度优先搜索结束，数独解决完毕；而如果遇到不符合的情况，则要回溯复原当前填入的数字，再继续循环填入下一个数字。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>solveSudoku</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>solve</span><span>(board, </span><span>0</span><span>, </span><span>0</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>// solve based on index</span></div></div><div><div><div>7</div></div><div><span>    </span><span>private</span><span> </span><span>Boolean</span><span> </span><span>solve</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>// finish all 9 row</span></div></div><div><div><div>9</div></div><div><span>        </span><span>if</span><span><span> (i </span><span>==</span><span> </span></span><span>9</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// finish current row, jump to next row</span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (j </span><span>==</span><span> </span></span><span>9</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>return</span><span> </span><span>solve</span><span><span>(board, i</span><span>+</span></span><span>1</span><span>, </span><span>0</span><span>);</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>// non-digit, switch to next column</span></div></div><div><div><div>19</div></div><div><span>        </span><span>if</span><span><span> (board[i][j] </span><span>!=</span><span> </span></span><span>'.'</span><span>) {</span></div></div><div><div><div>20</div></div><div><span>            </span><span>return</span><span> </span><span>solve</span><span><span>(board, i, j</span><span>+</span></span><span>1</span><span>);</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>// backtrack</span></div></div><div><div><div>24</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>'1'</span><span><span>; c </span><span>&lt;=</span><span> </span></span><span>'9'</span><span>; c++) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>if</span><span> (</span><span>check</span><span>(board, i, j, c)) {</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>board[i][j] </span><span>=</span><span> c;</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>                </span><span>// all subsequent cells are valid</span></div></div><div><div><div>29</div></div><div><span>                </span><span>if</span><span> (</span><span>solve</span><span><span>(board, i, j</span><span>+</span></span><span>1</span><span>)) {</span></div></div><div><div><div>30</div></div><div><span>                    </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>board[i][j] </span><span>=</span><span> </span><span>'.'</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>; </span><span>// no solution</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>    </span><span>// check if current character is valid</span></div></div><div><div><div>41</div></div><div><span>    </span><span>private</span><span> </span><span>Boolean</span><span> </span><span>check</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>, </span></span><span>char</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>42</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; c </span><span>&lt;</span><span> </span></span><span>9</span><span>; c++) {</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>            </span><span>// duplicate in current row, column or 3 * 3 block</span></div></div><div><div><div>45</div></div><div><span>            </span><span>if</span><span><span> (board[i][c] </span><span>==</span><span> val </span><span>||</span></span></div></div><div><div><div>46</div></div><div><span><span>                </span></span><span>board[c][j] </span><span>==</span><span> val </span><span>||</span></div></div><div><div><div>47</div></div><div><span><span>                </span></span><span>board[i </span><span>-</span><span> i</span><span>%</span><span>3</span><span><span> </span><span>+</span><span> c</span><span>/</span></span><span>3</span><span><span>][j </span><span>-</span><span> j</span><span>%</span></span><span>3</span><span><span> </span><span>+</span><span> c</span><span>%</span></span><span>3</span><span><span>] </span><span>==</span><span> val) {</span></span></div></div><div><div><div>48</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>52</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>38. Count and Say<a href="#38-count-and-say"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/count-and-say/" target="_blank">https://leetcode.com/problems/count-and-say/</a></p><hr /><p>直接的想法是使用递归。递归的起点显然是<code>n</code>为1的情况。此后对于任意输入的<code>n</code>，先计算出<code>n-1</code>的结果字符串<code>pre</code>，再遍历<code>pre</code>得到<code>n</code>的结果。遍历<code>pre</code>时，统计当前数字连续出现了几次，把数字和次数直接加到StringBuilder里。</p><p>注意使用StringBuilder的目的主要是优化性能，因为String每次追加字符时都会产生新的对象；而StringBuilder与StringBuffer都是直接在同一对象上追加字符，效率很高。另外StringBuffer()适合多线程，而StringBuilder()适合单线程。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>countAndSay</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>"1"</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// all upper levels' result</span></div></div><div><div><div>8</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>pre</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>(</span><span>countAndSay</span><span><span>(n </span><span>-</span><span> </span></span><span>1</span><span>));</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// construct this level</span></div></div><div><div><div>11</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>14</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>pre</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// current number's count</span></div></div><div><div><div>16</div></div><div><span>            </span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i; </span></span><span>// start index of current number</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>            </span><span>char</span><span><span> </span><span>say</span><span> </span></span><span><span>=</span><span> </span></span><span>pre</span><span>.</span><span>charAt</span><span>(j);</span></div></div><div><div><div>19</div></div><div><span>            </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>pre</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>pre</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> say) {</span></span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>count++;</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>            </span><span>result</span><span>.</span><span>append</span><span>(count);</span></div></div><div><div><div>25</div></div><div><span>            </span><span>result</span><span>.</span><span>append</span><span>(say);</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> </span><span>result</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>39. Combination Sum<a href="#39-combination-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/combination-sum/" target="_blank">https://leetcode.com/problems/combination-sum/</a></p><hr /><p>将原始数组排序，并遍历数组，创建一个新的临时数组用于存放当前的组合。每当向临时数组中添加一个数后，更新<code>target</code>，递归进入下一层搜索；由于每一个数可以使用无限次，下一次递归的起点下标<code>index</code>不变。最后当<code>target</code>等于0，说明当前组合满足；否则，则将临时数组中最后一个元素移除，寻找下一个数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>combinationSum</span><span>(</span><span>int</span><span><span>[] </span><span>candidates</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(candidates);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>backtrack</span><span>(result, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(), candidates, target, </span><span>0</span><span>);</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>temp</span><span>, </span></span><span>int</span><span><span>[] </span><span>candidates</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>if</span><span><span> (target </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(temp));</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> index; i </span><span>&lt;</span><span> </span></span><span>candidates</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> candidates[i] </span><span>&lt;=</span><span> target; i++) {</span></span></div></div><div><div><div>14</div></div><div><span>                </span><span>temp</span><span>.</span><span>add</span><span>(candidates[i]);</span></div></div><div><div><div>15</div></div><div><span>                </span><span>backtrack</span><span><span>(result, temp, candidates, target </span><span>-</span><span> candidates[i], i); </span></span><span>// allow duplicate, thus starts from i</span></div></div><div><div><div>16</div></div><div><span>                </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>40. Combination Sum II<a href="#40-combination-sum-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/combination-sum-ii/" target="_blank">https://leetcode.com/problems/combination-sum-ii/</a></p><hr /><p>与上一题几乎一样的题设，唯一不同是输入数组中可能有重复的数字，且数组中每个数只能用一次。只需要稍微改变上一题的代码，调整下一层递归的起始下标；此外，完成一次回溯后，需要及时跳过重复的数字。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>combinationSum2</span><span>(</span><span>int</span><span><span>[] </span><span>candidates</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(candidates);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>backtrack</span><span>(result, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(), candidates, target, </span><span>0</span><span>);</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>temp</span><span>, </span></span><span>int</span><span><span>[] </span><span>candidates</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>if</span><span><span> (target </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(temp));</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> index; i </span><span>&lt;</span><span> </span></span><span>candidates</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> candidates[i] </span><span>&lt;=</span><span> target; i++) {</span></span></div></div><div><div><div>14</div></div><div><span>                </span><span>temp</span><span>.</span><span>add</span><span>(candidates[i]);</span></div></div><div><div><div>15</div></div><div><span>                </span><span>backtrack</span><span><span>(result, temp, candidates, target </span><span>-</span><span> candidates[i], i </span><span>+</span><span> </span></span><span>1</span><span>); </span><span>// not allow duplicate, thus starts from i + 1</span></div></div><div><div><div>16</div></div><div><span>                </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>                </span><span>// skip duplicates</span></div></div><div><div><div>19</div></div><div><span>                </span><span>while</span><span><span> (i </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>&lt;</span><span> </span></span><span>candidates</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> candidates[i] </span><span>==</span><span> candidates[i </span><span>+</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>i++;</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>41. First Missing Positive<a href="#41-first-missing-positive"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/first-missing-positive/" target="_blank">https://leetcode.com/problems/first-missing-positive/</a></p><hr /><p>要寻找最小的缺失正整数，可以对数组进行处理：假如遍历发现了1，则将1放在数组第一个位置；发现2，则将2放在数组第二个位置…以此类推。当然，前提是只有遍历的元素值位于0和数组长度之间，才做此处理。</p><p>为了达到这一目的，只需要将<code>nums[i]</code>与<code>nums[nums[i] - 1]</code>进行交换即可。最后，重新遍历顺序处理后的数组，第一个元素值和下标不匹配的元素即为答案。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>firstMissingPositive</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>5</div></div><div><span>            </span><span>// if nums[i] is in the range of (0, len] and not in its place,</span></div></div><div><div><div>6</div></div><div><span>            </span><span>// put nums[i] on the (nums[i] - 1)th index of the array</span></div></div><div><div><div>7</div></div><div><span>            </span><span>while</span><span><span> (nums[i] </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> nums[i] </span><span>&lt;=</span><span> len </span><span>&amp;&amp;</span><span> nums[i] </span><span>!=</span><span> nums[nums[i] </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>8</div></div><div><span>                </span><span>// swap nums[i] and nums[nums[i] - 1]</span></div></div><div><div><div>9</div></div><div><span>                </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> nums[nums[i] </span><span>-</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>nums[nums[i] </span><span>-</span><span> </span><span>1</span><span><span>] </span><span>=</span><span> nums[i];</span></span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>nums[i] </span><span>=</span><span> temp;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// the first number unmatched is the answer</span></div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span><span> (nums[i] </span><span>!=</span><span> i </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>18</div></div><div><span>                </span><span>return</span><span><span> i </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// all matched, the smallest positive integer is last integer + 1</span></div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span><span> len </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>42. Trapping Rain Water<a href="#42-trapping-rain-water"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/trapping-rain-water/" target="_blank">https://leetcode.com/problems/trapping-rain-water/</a></p><hr /><p>使用左右两个指针跟踪当前的池壁高度。根据木桶效应，高度下界<code>lowerBound</code>取决于池壁高度较低的一边，而当前已有的水槽高度<code>currentLevel</code>则根据较低的池壁高度不断更新。指针移动过程中，新增的水量为<code>currentLevel</code>与<code>lowerBound</code>的差值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>trap</span><span>(</span><span>int</span><span><span>[] </span><span>height</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (height </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>height</span><span>.</span><span>length</span><span><span> </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>height</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>currentLevel</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, result </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>11</div></div><div><span>            </span><span>int</span><span><span> </span><span>lowerBound</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>// smaller of height[left] and height[right], then move left or right accordingly</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span><span> (height[left] </span><span>&lt;=</span><span> height[right]) {</span></span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>lowerBound </span><span>=</span><span> height[left];</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>left++;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>lowerBound </span><span>=</span><span> height[right];</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>right--;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>// update current bar's level</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>currentLevel </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(currentLevel, lowerBound);</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>            </span><span>// new water fills in</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> currentLevel </span><span>-</span><span> lowerBound;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>43. Multiply Strings<a href="#43-multiply-strings"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/multiply-strings/" target="_blank">https://leetcode.com/problems/multiply-strings/</a></p><hr /><p>此题限定了输入字符串只包含数字，并且不能直接转成整数再调用乘法计算，实际上便是指定了思路：模拟实现大数的乘法运算，类似于小学进行竖式乘法的过程。</p><p>对于一个<code>m</code>位整数与一个<code>n</code>位整数，其结果的长度一定为<code>m+n-1</code>或<code>m+n</code>，因此可以提前创建一个长为<code>m+n</code>的数组用于存放最终结果的每一位数。双重循环遍历两个整数，可以发现<code>num1[i] * num2[j]</code>的结果对应的是<code>result[i+j+1]</code>。明确了位数之后，剩余的工作较为简单，只需逐位求值，保留尾数，提取进位向前累加即可。输出结果时，需要去掉起始的0。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>multiply</span><span>(</span><span>String</span><span><span> </span><span>num1</span><span>, </span></span><span>String</span><span><span> </span><span>num2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>num1</span><span>.</span><span>length</span><span><span>(), n </span><span>=</span><span> </span></span><span>num2</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>if</span><span><span> (m </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> n </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>return</span><span> </span><span>"0"</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>        </span><span>if</span><span> (</span><span>num1</span><span>.</span><span>equals</span><span>(</span><span>"0"</span><span><span>) </span><span>||</span><span> </span></span><span>num2</span><span>.</span><span>equals</span><span>(</span><span>"0"</span><span>)) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>return</span><span> </span><span>"0"</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// num1[i] * num2[j] reflects on result[i+j+1]</span></div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[m</span><span>+</span><span>n];</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> m</span><span>-</span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> n</span><span>-</span></span><span>1</span><span><span>; j </span><span>&gt;=</span><span> </span></span><span>0</span><span>; j--) {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>result[i</span><span>+</span><span>j</span><span>+</span><span>1</span><span><span>] </span><span>+=</span><span> (</span></span><span>num1</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'0'</span><span><span>) </span><span>*</span><span> (</span></span><span>num2</span><span>.</span><span>charAt</span><span><span>(j) </span><span>-</span><span> </span></span><span>'0'</span><span>);</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// calculate each digit and each carry</span></div></div><div><div><div>21</div></div><div><span>        </span><span>int</span><span><span> </span><span>carry</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>22</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> </span></span><span>result</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span>; k </span><span>&gt;=</span><span> </span></span><span>0</span><span>; k--) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>int</span><span><span> </span><span>digit</span><span> </span></span><span><span>=</span><span> (result[k] </span><span>+</span><span> carry) </span><span>%</span><span> </span></span><span>10</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>carry </span><span>=</span><span> (result[k] </span><span>+</span><span> carry) </span><span>/</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>result[k] </span><span>=</span><span> digit;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// trim all leading 0</span></div></div><div><div><div>31</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>each</span><span> </span></span><span>:</span><span> result) {</span></div></div><div><div><div>32</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span><span>(each </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>sb</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>)) {</span></div></div><div><div><div>33</div></div><div><span>                </span><span>sb</span><span>.</span><span>append</span><span>(each);</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>44. Wildcard Matching<a href="#44-wildcard-matching"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/wildcard-matching/" target="_blank">https://leetcode.com/problems/wildcard-matching/</a></p><hr /><p>解法一，参考Regular Expression Matching中的解法，使用二维动态规划：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isMatch</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>String</span><span><span> </span><span>p</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>boolean</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span>[</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>+</span><span> </span></span><span>1</span><span>][</span><span>p</span><span>.</span><span>length</span><span><span>()</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span>][</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// empty pattern cannot match with any string</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>dp[i][</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>false</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>// multiple '*' pattern can match with empty string</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;=</span><span> </span></span><span>p</span><span>.</span><span>length</span><span>(); j++) {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span> (</span><span>p</span><span>.</span><span>charAt</span><span><span>(j</span><span>-</span></span><span>1</span><span><span>) </span><span>!=</span><span> </span></span><span>'*'</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>dp[</span><span>0</span><span><span>][j] </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>p</span><span>.</span><span>length</span><span>(); j++) {</span></div></div><div><div><div>22</div></div><div><span>                </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>p</span><span>.</span><span>charAt</span><span><span>(j) </span><span>||</span><span> </span></span><span>p</span><span>.</span><span>charAt</span><span><span>(j) </span><span>==</span><span> </span></span><span>'?'</span><span>) {</span></div></div><div><div><div>23</div></div><div><span><span>                    </span></span><span>dp[i</span><span>+</span><span>1</span><span><span>][j</span><span>+</span></span><span>1</span><span><span>] </span><span>=</span><span> dp[i][j];</span></span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>p</span><span>.</span><span>charAt</span><span><span>(j) </span><span>==</span><span> </span></span><span>'*'</span><span>) {</span></div></div><div><div><div>25</div></div><div><span><span>                    </span></span><span>dp[i</span><span>+</span><span>1</span><span><span>][j</span><span>+</span></span><span>1</span><span><span>] </span><span>=</span><span> dp[i</span><span>+</span></span><span>1</span><span><span>][j] </span><span>||</span><span> dp[i][j</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>27</div></div><div><span><span>                    </span></span><span>dp[i][j] </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>return</span><span> dp[</span><span>s</span><span>.</span><span>length</span><span>()][</span><span>p</span><span>.</span><span>length</span><span>()];</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>解法二，使用指针：</p><p>使用两个指针<code>sIdx</code>和<code>pIdx</code>分别跟踪<code>s</code>和<code>p</code>，分类讨论所有情况：</p><ul>
<li>严格的单字对应，或<code>p</code>中出现<code>?</code>，两个指针分别前移</li>
<li><code>p</code>遇到<code>*</code>，暂不清楚匹配情况，记录<code>s</code>当前的匹配起点和<code>p</code>最近一个<code>*</code>的位置，前移<code>pIdx</code></li>
<li>前一个<code>pIdx</code>是<code>*</code>，但现在不是，可能对应着匹配多个字符的情况，将<code>pIdx</code>置于最近一个*的右侧，并前移<code>sIdx</code></li>
</ul><p>其他情况下，直接判定为匹配失败。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isMatch</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>String</span><span><span> </span><span>p</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>sIdx</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, pIdx </span><span>=</span><span> </span></span><span>0</span><span><span>, match </span><span>=</span><span> </span></span><span>0</span><span><span>, starIdx </span><span>=</span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>while</span><span><span> (sIdx </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>if</span><span><span> (pIdx </span><span>&lt;</span><span> </span></span><span>p</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> (</span></span><span>p</span><span>.</span><span>charAt</span><span><span>(pIdx) </span><span>==</span><span> </span></span><span>'?'</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span><span>(sIdx) </span><span>==</span><span> </span></span><span>p</span><span>.</span><span>charAt</span><span>(pIdx))) {</span></div></div><div><div><div>7</div></div><div><span>                </span><span>// regular match or match ?, moving both pointers forward</span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>sIdx++;</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>pIdx++;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (pIdx </span><span>&lt;</span><span> </span></span><span>p</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>p</span><span>.</span><span>charAt</span><span><span>(pIdx) </span><span>==</span><span> </span></span><span>'*'</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>                </span><span>// * found, only moving pattern pointer forward</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>starIdx </span><span>=</span><span> pIdx; </span><span>// update the latest *'s index</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>match </span><span>=</span><span> sIdx;</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>pIdx++;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (starIdx </span><span>!=</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>                </span><span>// last pattern pointer was * but current is not, moving string pointer forward to match</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>pIdx </span><span>=</span><span> starIdx </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>sIdx </span><span>=</span><span> ++match;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// check for remaining characters in pattern</span></div></div><div><div><div>23</div></div><div><span>        </span><span>while</span><span><span> (pIdx </span><span>&lt;</span><span> </span></span><span>p</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>p</span><span>.</span><span>charAt</span><span><span>(pIdx) </span><span>==</span><span> </span></span><span>'*'</span><span>) {</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>pIdx++;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span><span> pIdx </span><span>==</span><span> </span></span><span>p</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>45. Jump Game II<a href="#45-jump-game-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/jump-game-ii/" target="_blank">https://leetcode.com/problems/jump-game-ii/</a></p><hr /><p>此题需要使用贪心算法。第<code>i</code>次跳跃中，必然有<code>nums[i]</code>个可选落点，检查每一个可选落点最远可以到达何处，选取最远的一个作为下一次跳跃的最远边界。以此类推，每一步都选择下一步可能最远的落点，直到最终可以到达终点。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>jump</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>steps</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// steps taken</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>start</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, end </span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// in current step, I can reach the interval [start, end]</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>maxEnd</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// the farthest fall of the jump</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>while</span><span><span> (end </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>steps++;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>            </span><span>// find out the maxEnd</span></div></div><div><div><div>15</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> start; i </span><span>&lt;=</span><span> end; i++) {</span></span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>maxEnd </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(maxEnd, nums[i] </span><span>+</span><span> i);</span></span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>// generate next [start, end] range</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>start </span><span>=</span><span> end </span><span>+</span><span> </span><span>1</span><span>; </span><span>// next range's start must be larger than current range's end</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>end </span><span>=</span><span> maxEnd;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> steps;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>46. Permutations<a href="#46-permutations"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/permutations/" target="_blank">https://leetcode.com/problems/permutations/</a></p><hr /><p>使用通用的回溯算法解题模版。使用一个boolean数组跟踪每个下标的数字是否使用过，跳过已经使用过的数；在回溯的时候重新设为未使用。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>permute</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(nums);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>backtrack</span><span>(result, nums, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(), </span><span>new</span><span> </span><span>boolean</span><span>[</span><span>nums</span><span>.</span><span>length</span><span>]);</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>temp</span><span>, </span></span><span>boolean</span><span><span>[] </span><span>used</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>// match with num's length, add this permutation to result</span></div></div><div><div><div>11</div></div><div><span>        </span><span>if</span><span> (</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>==</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(temp));</span></div></div><div><div><div>13</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>// current number has already been used, skip</span></div></div><div><div><div>18</div></div><div><span>            </span><span>if</span><span><span> (used[i] </span><span>==</span><span> </span></span><span>true</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>// set current number as used and add it to temp permutation</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>used[i] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>24</div></div><div><span>            </span><span>temp</span><span>.</span><span>add</span><span>(nums[i]);</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>            </span><span>backtrack</span><span>(result, nums, temp, used);</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>            </span><span>// after using, reset current number as unused and remove it from temp permutation</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>used[i] </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>30</div></div><div><span>            </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>47. Permutations II<a href="#47-permutations-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/permutations-ii/" target="_blank">https://leetcode.com/problems/permutations-ii/</a></p><hr /><p>此题的输入数组可能含有重复的数字，只需要在上一题的基础上，跳过重复的数字即可。</p><p>需要注意，判断重复时，<code>used[i - 1]</code>和<code>!used[i - 1]</code>都能让代码成功运行，然而LeetCode运行时间显示，<code>!used[i - 1]</code>快的多，可能是因为LeetCode生成的随机测试数据中，包含重复的情况较多，因此我们发现当前一个相同的数字被使用时，我们也优先加入当前这个相同的数字，这样能更快试出所有permutation。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>permuteUnique</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span>&gt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(nums);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>backtrack</span><span>(result, nums, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(), </span><span>new</span><span> </span><span>boolean</span><span>[</span><span>nums</span><span>.</span><span>length</span><span>]);</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>temp</span><span>, </span></span><span>boolean</span><span><span>[] </span><span>used</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>// match with num's length, add this permutation to result</span></div></div><div><div><div>11</div></div><div><span>        </span><span>if</span><span> (</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>==</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>( </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(temp) );</span></div></div><div><div><div>13</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>// current number is used / if previous identical number is used, use current number</span></div></div><div><div><div>18</div></div><div><span>            </span><span>if</span><span><span> (used[i] </span><span>||</span><span> (i </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> nums[i] </span><span>==</span><span> nums[i</span><span>-</span></span><span>1</span><span><span>] </span><span>&amp;&amp;</span><span> </span><span>!</span><span>used[i</span><span>-</span></span><span>1</span><span>])) {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>// mark current number as used and add it to temp permutation</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>used[i] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>24</div></div><div><span>            </span><span>temp</span><span>.</span><span>add</span><span>(nums[i]);</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>            </span><span>backtrack</span><span>(result, nums, temp, used);</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>            </span><span>// after using, unmark current number as unused and remove it from temp permutation</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>used[i] </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>30</div></div><div><span>            </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>48. Rotate Image<a href="#48-rotate-image"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/rotate-image/" target="_blank">https://leetcode.com/problems/rotate-image/</a></p><hr /><p>观察发现，矩阵内的元素旋转实际上是在建构一个旋转矩形，矩形顶点的轮换导致了整个矩阵的变化。</p><p>例如对于例子中的两个矩阵，第一个矩阵中2, 4, 6, 8构成了一个旋转矩形，第二个矩阵中1, 10, 12, 13构成了一个旋转矩形。因此，对于任意一个<code>matrix[i][j]</code>，总能找到另外三个矩阵坐标顶点与之构成一个旋转矩形，只需推出其数学表达式即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>rotate</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (matrix </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// locate four corner points</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> (len </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>/</span><span> </span></span><span>2</span><span>; i++) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>/</span><span> </span></span><span>2</span><span>; j++) {</span></div></div><div><div><div>11</div></div><div><span>                </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> matrix[i][j]; </span></span><span>// first</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>matrix[i][j] </span><span>=</span><span> matrix[len </span><span>-</span><span> </span><span>1</span><span><span> </span><span>-</span><span> j][i]; </span></span><span>// second</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>matrix[len </span><span>-</span><span> </span><span>1</span><span><span> </span><span>-</span><span> j][i] </span><span>=</span><span> matrix[len </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>-</span><span> i][len </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>-</span><span> j]; </span></span><span>// third</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>matrix[len </span><span>-</span><span> </span><span>1</span><span><span> </span><span>-</span><span> i][len </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>-</span><span> j] </span><span>=</span><span> matrix[j][len </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>-</span><span> i]; </span></span><span>// fourth</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>matrix[j][len </span><span>-</span><span> </span><span>1</span><span><span> </span><span>-</span><span> i] </span><span>=</span><span> temp;</span></span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>49. Group Anagrams<a href="#49-group-anagrams"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/group-anagrams/" target="_blank">https://leetcode.com/problems/group-anagrams/</a></p><hr /><p>统计每个单词中各个字母出现的次数，存到一个长度为26的数组中。利用这个数组生成对应的hash码(<code>Arrays.hashCode()</code>)，具有相同hash码的字符串就可以被归类在一起。</p><p>如果字符串很短的情况下，也可以每一个字母映射一个质数，质数相乘作为hashcode，提升运行效率。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt;</span><span> </span></span><span>groupAnagrams</span><span>(</span><span>String</span><span><span>[] </span><span>strs</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// &lt;hash number, list index in result&gt;</span></div></div><div><div><div>6</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>s</span></span><span>:</span><span> strs) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span><span> </span><span>key</span><span> </span></span><span><span>=</span><span> </span></span><span>getKey</span><span>(s);</span></div></div><div><div><div>10</div></div><div><span>            </span><span>int</span><span><span> </span><span>resultIndex</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>getOrDefault</span><span><span>(key, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>list</span><span> </span></span><span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span><span> (resultIndex </span><span>==</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>list </span><span>=</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>15</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(list);</span></div></div><div><div><div>16</div></div><div><span>                </span><span>map</span><span>.</span><span>put</span><span>(key, </span><span>result</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>list </span><span>=</span><span> </span><span>result</span><span>.</span><span>get</span><span>(resultIndex);</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>list</span><span>.</span><span>add</span><span>(s);</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>// use count to generate hash number</span></div></div><div><div><div>27</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>getKey</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>28</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>29</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span></span><span>:</span><span> </span><span>s</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>map[c </span><span>-</span><span> </span><span>'a'</span><span>]++;</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>        </span><span>return</span><span> </span><span>Arrays</span><span>.</span><span>hashCode</span><span>(map);</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>如果字符串很短的情况下，也可以每一个字母映射一个质数，质数相乘作为hashcode，提升运行效率。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt;</span><span> </span></span><span>groupAnagrams</span><span>(</span><span>String</span><span><span>[] </span><span>strs</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (strs </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>strs</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// top 26 positive primes</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>prime</span><span> </span></span><span><span>=</span><span> {</span></span><span>2</span><span>, </span><span>3</span><span>, </span><span>5</span><span>, </span><span>7</span><span>, </span><span>11</span><span>, </span><span>13</span><span>, </span><span>17</span><span>, </span><span>19</span><span>, </span><span>23</span><span>, </span><span>29</span><span>, </span><span>31</span><span>, </span><span>41</span><span>, </span><span>43</span><span>, </span><span>47</span><span>, </span><span>53</span><span>, </span><span>59</span><span>, </span><span>61</span><span>, </span><span>67</span><span>, </span><span>71</span><span>, </span><span>73</span><span>, </span><span>79</span><span>, </span><span>83</span><span>, </span><span>89</span><span>, </span><span>97</span><span>, </span><span>101</span><span>, </span><span>103</span><span>};</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>// &lt;product, position in result&gt;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Long</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>str</span><span> </span></span><span>:</span><span> strs) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>// calculate current string's product</span></div></div><div><div><div>16</div></div><div><span>            </span><span>long</span><span><span> </span><span>product</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>17</div></div><div><span>            </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>ch</span><span> </span></span><span>:</span><span> </span><span>str</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>product </span><span>*=</span><span> prime[ch </span><span>-</span><span> </span><span>'a'</span><span>];</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>temp</span></span><span>;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>            </span><span>// current product is already in the map, add this string to specific list of result</span></div></div><div><div><div>24</div></div><div><span>            </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span>(product)) {</span></div></div><div><div><div>25</div></div><div><span>                </span><span>result</span><span>.</span><span>get</span><span>(</span><span>map</span><span>.</span><span>get</span><span>(product)).</span><span>add</span><span>(str);</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>27</div></div><div><span>                </span><span>// create a new list, add current string, then add the list to result</span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>temp </span><span>=</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>29</div></div><div><span>                </span><span>temp</span><span>.</span><span>add</span><span>(str);</span></div></div><div><div><div>30</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(temp);</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>                </span><span>// record this new list's index</span></div></div><div><div><div>33</div></div><div><span>                </span><span>map</span><span>.</span><span>put</span><span>(product, </span><span>result</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>50. Pow(x, n)<a href="#50-powx-n"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/powx-n/" target="_blank">https://leetcode.com/problems/powx-n/</a></p><hr /><p>实现幂函数的构造需要运用递归。然而在开始递归前，需要先排除一些输入的特殊情况。<code>n</code>和<code>x</code>各有若干特殊情况：</p><ul>
<li>输入的<code>x</code>为1，或是<code>n</code>为0，或是<code>x</code>为-1且<code>n</code>为整数下界，返回1</li>
<li>输入的<code>x</code>为0，或是<code>x</code>不为-1且<code>n</code>为整数下界，返回0</li>
<li>输入的<code>n</code>为负数，利用<code>x</code><sup>n</sup> = <code>(1/x)</code><sup>-n</sup>这一特点，将<code>n</code>转化成正数。</li>
</ul><p>完成上述处理后，分<code>n</code>的奇偶性进行递归调用。对于奇数，由于整数除法的舍入，需要额外乘一个<code>x</code>。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>double</span><span> </span><span>myPow</span><span>(</span><span>double</span><span><span> x</span><span>,</span><span> </span></span><span>int</span><span> n) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>if</span><span><span> (x </span><span>==</span><span> </span></span><span>1</span><span><span> </span><span>||</span><span> n </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> (n </span><span>==</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span><span> </span><span>&amp;&amp;</span><span> x </span><span>==</span><span> </span><span>-</span></span><span>1</span><span>)) {</span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>    </span><span>if</span><span><span> (x </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> (n </span><span>==</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span><span> </span><span>&amp;&amp;</span><span> x </span><span>!=</span><span> </span><span>-</span></span><span>1</span><span>)) {</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>    </span><span>if</span><span><span> (n </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>n </span><span>=</span><span> </span><span>-</span><span>n</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>x </span><span>=</span><span> </span><span>1</span><span><span>/</span><span>x</span><span>;</span></span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>    </span><span>// odd or even</span></div></div><div><div><div>13</div></div><div><span>    </span><span>return</span><span><span> (n </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) </span><span>?</span><span> </span><span>myPow</span><span><span>(x </span><span>*</span><span> x</span><span>,</span><span> n </span><span>/</span><span> </span></span><span>2</span><span>) </span><span>:</span><span><span> x </span><span>*</span><span> </span></span><span>myPow</span><span><span>(x </span><span>*</span><span> x</span><span>,</span><span> n </span><span>/</span><span> </span></span><span>2</span><span><span>)</span><span>;</span></span></div></div><div><div><div>14</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>51. N-Queens<a href="#51-n-queens"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/n-queens/" target="_blank">https://leetcode.com/problems/n-queens/</a></p><hr /><p>运用深度优先搜素，使用一个数组<code>queens</code>记录每一行的皇后位于第几列。每一行放置皇后并递归进入下一行。如果某一列已经摆放了皇后，或对角线上存在皇后，则当前单元格不能放置皇后。</p><p>当深度优先搜索结束后，根据<code>queens</code>记录的信息，生成一张棋盘图。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt;</span><span> </span></span><span>solveNQueens</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// queen's position in each row</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>queens</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>7</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span><span>(queens, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>dfs</span><span>(result, queens, </span><span>0</span><span>);</span></div></div><div><div><div>10</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>int</span><span><span>[] </span><span>queens</span><span>, </span></span><span>int</span><span><span> </span><span>row</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>queens</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// finish one solution</span></div></div><div><div><div>17</div></div><div><span>        </span><span>if</span><span><span> (len </span><span>==</span><span> row) {</span></span></div></div><div><div><div>18</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>temp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>            </span><span>// generate an n*n chessboard based on queens' positions</span></div></div><div><div><div>21</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span>:</span><span> queens) {</span></div></div><div><div><div>22</div></div><div><span>                </span><span>char</span><span><span>[] </span><span>boardRow</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[len];</span></div></div><div><div><div>23</div></div><div><span>                </span><span>Arrays</span><span>.</span><span>fill</span><span>(boardRow, </span><span>'.'</span><span>);</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>boardRow[i] </span><span>=</span><span> </span><span>'Q'</span><span>;</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>                </span><span>// char[] -&gt; str</span></div></div><div><div><div>27</div></div><div><span>                </span><span>temp</span><span>.</span><span>add</span><span>(</span><span>String</span><span>.</span><span>valueOf</span><span>(boardRow));</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>// add this chessboard to result</span></div></div><div><div><div>31</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(temp);</span></div></div><div><div><div>32</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>// look for suitable column to place queen in current row</span></div></div><div><div><div>36</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>col</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; col </span><span>&lt;</span><span> len; col++) {</span></span></div></div><div><div><div>37</div></div><div><span>            </span><span>if</span><span> (</span><span>isValid</span><span>(queens, row, col)) {</span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>queens[row] </span><span>=</span><span> col; </span><span>// put queen in current column</span></div></div><div><div><div>39</div></div><div><span>                </span><span>dfs</span><span><span>(result, queens, row </span><span>+</span><span> </span></span><span>1</span><span>); </span><span>// move to next row</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isValid</span><span>(</span><span>int</span><span><span>[] </span><span>queens</span><span>, </span></span><span>int</span><span><span> </span><span>row</span><span>, </span></span><span>int</span><span><span> </span><span>col</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>45</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> row; i++) {</span></span></div></div><div><div><div>46</div></div><div><span>            </span><span>// there should be no queen in this row or diagnosal line</span></div></div><div><div><div>47</div></div><div><span>            </span><span>if</span><span><span> (queens[i] </span><span>==</span><span> col </span><span>||</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(col </span><span>-</span><span> queens[i]) </span><span>==</span><span> row </span><span>-</span><span> i) {</span></span></div></div><div><div><div>48</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>53</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>52. N-Queens II<a href="#52-n-queens-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/n-queens-ii/" target="_blank">https://leetcode.com/problems/n-queens-ii/</a></p><hr /><p>与上一题完全一致，只是上一题返回整个结果列表，这一题返回结果的个数而已。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>totalNQueens</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// queen's position in each row</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>queens</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>7</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span><span>(queens, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>dfs</span><span>(result, queens, </span><span>0</span><span>);</span></div></div><div><div><div>10</div></div><div><span>        </span><span>return</span><span> </span><span>result</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>int</span><span><span>[] </span><span>queens</span><span>, </span></span><span>int</span><span><span> </span><span>row</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>queens</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// finish one solution</span></div></div><div><div><div>17</div></div><div><span>        </span><span>if</span><span><span> (len </span><span>==</span><span> row) {</span></span></div></div><div><div><div>18</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>temp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>            </span><span>// generate an n*n chessboard based on queens' positions</span></div></div><div><div><div>21</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span>:</span><span> queens) {</span></div></div><div><div><div>22</div></div><div><span>                </span><span>char</span><span><span>[] </span><span>boardRow</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[len];</span></div></div><div><div><div>23</div></div><div><span>                </span><span>Arrays</span><span>.</span><span>fill</span><span>(boardRow, </span><span>'.'</span><span>);</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>boardRow[i] </span><span>=</span><span> </span><span>'Q'</span><span>;</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>                </span><span>// char[] -&gt; str</span></div></div><div><div><div>27</div></div><div><span>                </span><span>temp</span><span>.</span><span>add</span><span>(</span><span>String</span><span>.</span><span>valueOf</span><span>(boardRow));</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>// add this chessboard to result</span></div></div><div><div><div>31</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(temp);</span></div></div><div><div><div>32</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>// look for suitable column to place queen in current row</span></div></div><div><div><div>36</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>col</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; col </span><span>&lt;</span><span> len; col++) {</span></span></div></div><div><div><div>37</div></div><div><span>            </span><span>if</span><span> (</span><span>isValid</span><span>(queens, row, col)) {</span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>queens[row] </span><span>=</span><span> col; </span><span>// put queen in current column</span></div></div><div><div><div>39</div></div><div><span>                </span><span>dfs</span><span><span>(result, queens, row </span><span>+</span><span> </span></span><span>1</span><span>); </span><span>// move to next row</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isValid</span><span>(</span><span>int</span><span><span>[] </span><span>queens</span><span>, </span></span><span>int</span><span><span> </span><span>row</span><span>, </span></span><span>int</span><span><span> </span><span>col</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>45</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> row; i++) {</span></span></div></div><div><div><div>46</div></div><div><span>            </span><span>// there should be no queen in this row or diagnosal line</span></div></div><div><div><div>47</div></div><div><span>            </span><span>if</span><span><span> (queens[i] </span><span>==</span><span> col </span><span>||</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(col </span><span>-</span><span> queens[i]) </span><span>==</span><span> row </span><span>-</span><span> i) {</span></span></div></div><div><div><div>48</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>53</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>53. Maximum Subarray<a href="#53-maximum-subarray"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/maximum-subarray/" target="_blank">https://leetcode.com/problems/maximum-subarray/</a></p><hr /><p>使用一个临时变量<code>tempSum</code>从首个元素开始跟踪当前的子序列和。只有确保子序列和大于0才继续累积；否则就从当前元素开始重新寻找新的最大子序列。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxSubArray</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> nums[</span></span><span>0</span><span><span>], tempSum </span><span>=</span><span> nums[</span></span><span>0</span><span>];</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// if subarray's sum is larger than 0, add nums[i]; or, tempSum should be reset as nums[i]</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>tempSum </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(tempSum, </span><span>0</span><span><span>) </span><span>+</span><span> nums[i];</span></span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, tempSum);</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>54. Spiral Matrix<a href="#54-spiral-matrix"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/spiral-matrix/" target="_blank">https://leetcode.com/problems/spiral-matrix/</a></p><hr /><p>分别使用四个变量，储存目前输出行、列的两个边界值，保证输出发生在两个边界之内。每一圈输出都按照右、下、左、上的顺序进行，但要注意由于奇偶性关系，左和上的输出可能是不必要的（如果边界值已经重合了）。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>spiralOrder</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (matrix </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span>, up </span><span>=</span><span> </span></span><span>0</span><span><span>, down </span><span>=</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right </span><span>&amp;&amp;</span><span> up </span><span>&lt;=</span><span> down) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>// right</span></div></div><div><div><div>11</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> left; j </span><span>&lt;=</span><span> right; j++) {</span></span></div></div><div><div><div>12</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(matrix[up][j]);</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>up++;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>// down</span></div></div><div><div><div>17</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> up; i </span><span>&lt;=</span><span> down; i++) {</span></span></div></div><div><div><div>18</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(matrix[i][right]);</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>right--;</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>// left, only when up &lt;= down</span></div></div><div><div><div>23</div></div><div><span>            </span><span>if</span><span><span> (up </span><span>&lt;=</span><span> down) {</span></span></div></div><div><div><div>24</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> right; j </span><span>&gt;=</span><span> left; j--) {</span></span></div></div><div><div><div>25</div></div><div><span>                    </span><span>result</span><span>.</span><span>add</span><span>(matrix[down][j]);</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>down--;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>// up, only when left &lt;= right</span></div></div><div><div><div>31</div></div><div><span>            </span><span>if</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>32</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> down; i </span><span>&gt;=</span><span> up; i--) {</span></span></div></div><div><div><div>33</div></div><div><span>                    </span><span>result</span><span>.</span><span>add</span><span>(matrix[i][left]);</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>left++;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>55. Jump Game<a href="#55-jump-game"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/jump-game/" target="_blank">https://leetcode.com/problems/jump-game/</a></p><hr /><p>此题判断的是能否到达数组终点。仍然使用贪心算法，选取能达到最远位置的落点进行跳跃。</p><p>然而，落点可能永远无法落到终点或终点之后，此时下一次备选的落点区域边界<code>start</code>和<code>end</code>都将无法更新，因此需要额外判断这两个落点的关系。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>canJump</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>start</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, end </span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// in current step, I can reach the interval [start, end]</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>maxEnd</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// the farthest fall of the jump</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>while</span><span><span> (end </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>// find out the maxEnd</span></div></div><div><div><div>12</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> start; i </span><span>&lt;=</span><span> end; i++) {</span></span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>maxEnd </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(maxEnd, nums[i] </span><span>+</span><span> i);</span></span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>// generate next [start, end] range</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>start </span><span>=</span><span> end </span><span>+</span><span> </span><span>1</span><span>; </span><span>// next range's start must be larger than current range's end</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>end </span><span>=</span><span> maxEnd;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>            </span><span>// this indicates that end does not change, so we cannot go further</span></div></div><div><div><div>21</div></div><div><span>            </span><span>if</span><span><span> (start </span><span>==</span><span> end </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>22</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>56. Merge Intervals<a href="#56-merge-intervals"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/merge-intervals/" target="_blank">https://leetcode.com/problems/merge-intervals/</a></p><hr /><p>将输入的数组元素按区间起始值从小到大排序。</p><ul>
<li>倘若如果出现了重叠，则更新前一个区间的<code>end</code>值。相当于间接合并了区间，把两个区间看作一个整体</li>
<li>没有重叠，将当前区间加入结果集合中。这个区间同时也是当前遍历到的最后一个有效区间</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[][] </span><span>merge</span><span>(</span><span>int</span><span><span>[][] </span><span>intervals</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (intervals </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span><span> </span><span>&lt;</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> intervals;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// sort by interval start</span></div></div><div><div><div>8</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(intervals, (</span><span>int</span><span>[] interval1, </span><span>int</span><span>[] interval2) </span><span>-&gt;</span><span> {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>return</span><span> interval1[</span><span>0</span><span><span>] </span><span>-</span><span> interval2[</span></span><span>0</span><span>];</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>});</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>int</span><span><span>[]&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>prev</span><span> </span></span><span><span>=</span><span> intervals[</span></span><span>0</span><span>];</span></div></div><div><div><div>14</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(prev);</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>current</span><span> </span></span><span>:</span><span> intervals) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span> (current[</span><span>0</span><span><span>] </span><span>&lt;=</span><span> prev[</span></span><span>1</span><span>]) {</span></div></div><div><div><div>18</div></div><div><span>                </span><span>// Overlapping intervals, update previous interval's end</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>prev[</span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(prev[</span><span>1</span><span>], current[</span><span>1</span><span>]);</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>21</div></div><div><span>                </span><span>// No overlapping, add current to result</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>prev </span><span>=</span><span> current;</span></div></div><div><div><div>23</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(current);</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>// convert list to array</span></div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> </span><span>result</span><span>.</span><span>toArray</span><span>(</span><span>new</span><span> </span><span>int</span><span>[</span><span>result</span><span>.</span><span>size</span><span>()][</span><span>2</span><span>]);</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>57. Insert Interval<a href="#57-insert-interval"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/insert-interval/" target="_blank">https://leetcode.com/problems/insert-interval/</a></p><hr /><ol>
<li>添加肯定位于<code>newInterval</code>之前的区间</li>
<li>针对所有和<code>newInterval</code>有重叠的区间，计算出最小的起点和最大的终点，直接合并</li>
<li>添加合并后的大区间</li>
<li>添加肯定位于<code>newInterval</code>之后的区间</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[][] </span><span>insert</span><span>(</span><span>int</span><span><span>[][] </span><span>intervals</span><span>, </span></span><span>int</span><span><span>[] </span><span>newInterval</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (intervals </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[][] {</span></div></div><div><div><div>5</div></div><div><span><span>                </span></span><span>{ newInterval[</span><span>0</span><span>], newInterval[</span><span>1</span><span>] }</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>int</span><span><span>[]&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, start </span><span>=</span><span> newInterval[</span></span><span>0</span><span><span>], end </span><span>=</span><span> newInterval[</span></span><span>1</span><span>];</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// intervals prior to newInterval</span></div></div><div><div><div>13</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> intervals[i][</span></span><span>1</span><span><span>] </span><span>&lt;</span><span> start) {</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(intervals[i]);</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>i++;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>// for all overlapping intervals, find the minimum start and maximum end</span></div></div><div><div><div>19</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> intervals[i][</span></span><span>0</span><span><span>] </span><span>&lt;=</span><span> end) {</span></span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>start </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(start, intervals[i][</span><span>0</span><span>]);</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>end </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(end, intervals[i][</span><span>1</span><span>]);</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>i++;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>// assume all overlapping intervals are merged in one big interval [start, end]</span></div></div><div><div><div>26</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>int</span><span>[]{start, end});</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>// add the rest intervals</span></div></div><div><div><div>29</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>30</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(intervals[i++]);</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span> </span><span>result</span><span>.</span><span>toArray</span><span>(</span><span>new</span><span> </span><span>int</span><span>[</span><span>result</span><span>.</span><span>size</span><span>()][</span><span>2</span><span>]);</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>58. Length of Last Word<a href="#58-length-of-last-word"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/length-of-last-word/" target="_blank">https://leetcode.com/problems/length-of-last-word/</a></p><hr /><p>先排除从最右侧开始含有若干空白字符的情况；之后从第一个非空白的字符开始向左遍历，直至遇到下一个空格为止，统计中间经过了多少个字符。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>lengthOfLastWord</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, index </span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// trim all trailing 0</span></div></div><div><div><div>9</div></div><div><span>        </span><span>while</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(index) </span><span>==</span><span> </span></span><span>' '</span><span>) {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>index--;</span></div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span><span> (index </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>                </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// calculate last word's length</span></div></div><div><div><div>17</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> index; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>' '</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>return</span><span> result;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>result++;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>59. Spiral Matrix II<a href="#59-spiral-matrix-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/spiral-matrix-ii/" target="_blank">https://leetcode.com/problems/spiral-matrix-ii/</a></p><hr /><p>提前分配好二维数组空间，螺旋遍历逐个将数字塞入即可。由于是<code>n * n</code>矩阵，因此不用考虑矩阵长宽不一致的情况。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[][] </span><span>generateMatrix</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n][n];</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// current number to be added</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>current</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>up</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, down </span><span>=</span><span> n </span><span>-</span><span> </span></span><span>1</span><span><span>, left </span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> n </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>11</div></div><div><span>            </span><span>// right</span></div></div><div><div><div>12</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> left; j </span><span>&lt;=</span><span> right; j++) {</span></span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>result[up][j] </span><span>=</span><span> current++;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>up++;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>// down</span></div></div><div><div><div>18</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> up; i </span><span>&lt;=</span><span> down; i++) {</span></span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>result[i][right] </span><span>=</span><span> current++;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>right--;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>            </span><span>// left</span></div></div><div><div><div>24</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> right; j </span><span>&gt;=</span><span> left; j--) {</span></span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>result[down][j] </span><span>=</span><span> current++;</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>down--;</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>            </span><span>// up</span></div></div><div><div><div>30</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> down; i </span><span>&gt;=</span><span> up; i--) {</span></span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>result[i][left] </span><span>=</span><span> current++;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>left++;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>60. Permutation Sequence<a href="#60-permutation-sequence"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/permutation-sequence/" target="_blank">https://leetcode.com/problems/permutation-sequence/</a></p><hr /><p>由于题目限定输入的<code>n</code>在1-9之内，因此最快速的方法是提前将1-9的阶乘算好存在数组中。</p><p>从1开始遍历到<code>n</code>，每一步我们都可以算出固定当前位的前提下，后续共有多少种组合情况；因此我们可以用<code>k / currMaxFactorial</code>得到当前位需要向上增加多少<code>offset</code>才可以快速逼近第<code>k</code>种组合。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>getPermutation</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>factorials</span><span> </span></span><span><span>=</span><span> {</span></span><span>1</span><span>, </span><span>1</span><span>, </span><span>2</span><span>, </span><span>6</span><span>, </span><span>24</span><span>, </span><span>120</span><span>, </span><span>720</span><span>, </span><span>5040</span><span>, </span><span>40320</span><span>};</span></div></div><div><div><div>4</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>5</div></div><div><span>        </span><span>boolean</span><span><span>[] </span><span>used</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span>[</span><span>10</span><span>];</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// minus starting k by 1 to get correct offset, otherwise we will exactly the (k+1) th permutation</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>k--;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>11</div></div><div><span>            </span><span>// for current i and n, this is the max factorial threshold</span></div></div><div><div><div>12</div></div><div><span>            </span><span>int</span><span><span> </span><span>currMaxFactorial</span><span> </span></span><span><span>=</span><span> factorials[n </span><span>-</span><span> i];</span></span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>            </span><span>// the diff between current digit (0) and ideal digit</span></div></div><div><div><div>15</div></div><div><span>            </span><span>// if we fix current digit, we get currMaxFactorial permutations for subsequent digits</span></div></div><div><div><div>16</div></div><div><span>            </span><span>int</span><span><span> </span><span>offset</span><span> </span></span><span><span>=</span><span> k </span><span>/</span><span> currMaxFactorial;</span></span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>            </span><span>// find the digit to append</span></div></div><div><div><div>19</div></div><div><span>            </span><span>int</span><span><span> </span><span>digit</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span>            </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>21</div></div><div><span>            </span><span>while</span><span><span> (count </span><span>&lt;=</span><span> offset) {</span></span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>digit++;</span></div></div><div><div><div>23</div></div><div><span>                </span><span>if</span><span><span> (</span><span>!</span><span>used[digit]) {</span></span></div></div><div><div><div>24</div></div><div><span><span>                    </span></span><span>count++;</span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>            </span><span>// append current digit and mark as used</span></div></div><div><div><div>29</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(digit);</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>used[digit] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>            </span><span>// we have covered the first currMaxFactorial permutations, so update k and cover the rest</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>k </span><span>%=</span><span> currMaxFactorial;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>61. Rotate List<a href="#61-rotate-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/rotate-list/" target="_blank">https://leetcode.com/problems/rotate-list/</a></p><hr /><ol>
<li>获取链表的总长度，并将最后一个元素指向头元素，该过程遍历一次链表可完成</li>
<li>计算出指针实际移动的距离。尽管<code>k</code>的值可能大于链表长度，但是取模后即可解决这个问题</li>
<li>返回新的<code>head</code>，新的结尾将指向NULL</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>rotateRight</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> k </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> head;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// get list length and set the last node's next to head</span></div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span> </span><span>length</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> head;</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>while</span><span> (</span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>length++;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>        </span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> head;</span></span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>// actual move length</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>k </span><span>%=</span><span> length;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>k++;</span></div></div><div><div><div>29</div></div><div><span>        </span><span>int</span><span><span> </span><span>move</span><span> </span></span><span><span>=</span><span> length </span><span>-</span><span> k;</span></span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>// find new head</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>cur </span><span>=</span><span> head;</span></div></div><div><div><div>33</div></div><div><span>        </span><span>while</span><span><span> (move </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>move--;</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>newHead</span><span> </span></span><span><span>=</span><span> </span></span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>38</div></div><div><span>        </span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>return</span><span> newHead;</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>62. Unique Paths<a href="#62-unique-paths"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/unique-paths/" target="_blank">https://leetcode.com/problems/unique-paths/</a></p><hr /><p>使用动态规划，记录到达每一个方格的路径总数，不断递推到出口。</p><p>二维空间下，很容易发现动态规划递推式为：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>dp[i][j] = dp[i - 1][j] + dp[i][j - 1];</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>dp[i][j]</code>依赖的两个值分别是<code>dp[i - 1][j]</code>(对应上一行的同一列)和<code>dp[i][j - 1]</code>(对应同一行的上一列)。因此我们可以进行空间的压缩：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>cur[j] = pre[j] + cur[j - 1]</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>// pre is last line</span></div></div><div><div><div>4</div></div><div><span>// cur is current line</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在更新<code>cur[j]</code>之前，实际上<code>pre[j]</code>和<code>cur[j]</code>的值就是相等的，因为上一行时的<code>cur</code>自然就是这一行<code>pre</code>。所以可以得到：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>cur[j] = cur[j] + cur[j - 1]</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>// or</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>dp[j] += dp[j - 1]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>因此最终我们使用一维动态数组降低空间复杂度。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>uniquePaths</span><span>(</span><span>int</span><span><span> </span><span>m</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (m </span><span>&lt;</span><span> </span></span><span>1</span><span><span> </span><span>||</span><span> n </span><span>&lt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// row by row and accumulate one by one</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> m; i++) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> n; j++) {</span></span></div></div><div><div><div>13</div></div><div><span>                </span><span>if</span><span><span> (j </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>14</div></div><div><span><span>                    </span></span><span>dp[j] </span><span>+=</span><span> dp[j</span><span>-</span><span>1</span><span>];</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span><span> dp[n</span><span>-</span></span><span>1</span><span>];</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>63. Unique Paths II<a href="#63-unique-paths-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/unique-paths-ii/" target="_blank">https://leetcode.com/problems/unique-paths-ii/</a></p><hr /><p>仍然使用一维数组动态规划；遇到障碍物时，该列在动态规划中的结果重置为0。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>uniquePathsWithObstacles</span><span>(</span><span>int</span><span><span>[][] </span><span>obstacleGrid</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (obstacleGrid </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>obstacleGrid</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> obstacleGrid[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>obstacleGrid</span><span>.</span><span>length</span><span><span>, n </span><span>=</span><span> obstacleGrid[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>// row by row and accumulate one by one</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> m; i++) {</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> n; j++) {</span></span></div></div><div><div><div>14</div></div><div><span>                </span><span>// when obstacle encountered, this column's result is reset to 0</span></div></div><div><div><div>15</div></div><div><span>                </span><span>if</span><span><span> (obstacleGrid[i][j] </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>16</div></div><div><span><span>                    </span></span><span>dp[j] </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (j </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>18</div></div><div><span><span>                    </span></span><span>dp[j] </span><span>+=</span><span> dp[j</span><span>-</span><span>1</span><span>];</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span><span> dp[n</span><span>-</span></span><span>1</span><span>];</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>64. Minimum Path Sum<a href="#64-minimum-path-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minimum-path-sum/" target="_blank">https://leetcode.com/problems/minimum-path-sum/</a></p><hr /><p>对于左边界和右边界上的点，只存在一条道走到黑的情况；对于不在左边界/上边界的点，只需要比较其上方和左方的单元格中哪一格路径更小，即可不断迭代出结果。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minPathSum</span><span>(</span><span>int</span><span><span>[][] </span><span>grid</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (grid </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>grid</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> grid[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>grid</span><span>.</span><span>length</span><span><span>, n </span><span>=</span><span> grid[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[m][n];</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span>][</span><span>0</span><span><span>] </span><span>=</span><span> grid[</span></span><span>0</span><span>][</span><span>0</span><span>];</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// fill first row and first column</span></div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;</span><span> n; j++) {</span></span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>dp[</span><span>0</span><span><span>][j] </span><span>=</span><span> grid[</span></span><span>0</span><span><span>][j] </span><span>+</span><span> dp[</span></span><span>0</span><span><span>][j</span><span>-</span></span><span>1</span><span>];</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> m; i++) {</span></span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>dp[i][</span><span>0</span><span><span>] </span><span>=</span><span> grid[i][</span></span><span>0</span><span><span>] </span><span>+</span><span> dp[i</span><span>-</span></span><span>1</span><span>][</span><span>0</span><span>];</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// for other grids, choose the smaller value of up or left grid's value</span></div></div><div><div><div>21</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> m; i++) {</span></span></div></div><div><div><div>22</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;</span><span> n; j++) {</span></span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>dp[i][j] </span><span>=</span><span> grid[i][j] </span><span>+</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(dp[i</span><span>-</span></span><span>1</span><span><span>][j], dp[i][j</span><span>-</span></span><span>1</span><span>]);</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span><span> dp[m</span><span>-</span></span><span>1</span><span><span>][n</span><span>-</span></span><span>1</span><span>];</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>65. Valid Number<a href="#65-valid-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/valid-number/" target="_blank">https://leetcode.com/problems/valid-number/</a></p><hr /><p>正常情况下，出现数字时默认算作valid number，但考虑一些特殊情况：</p><ul>
<li>出现小数点时，小数点前不能有e（或者E），且小数点不能超过一个</li>
<li>出现<code>e</code>（或者<code>E</code>）时，<code>e</code>不能超过1个，且<code>e</code>前必须有数字</li>
<li>出现正负号时，正负号必须为首字符或紧跟在<code>e</code>之后</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isNumber</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>s </span><span>=</span><span> </span><span>s</span><span>.</span><span>trim</span><span>(); </span><span>// trim all leading blank space</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>boolean</span><span><span> </span><span>pointSeen</span><span> </span></span><span><span>=</span><span> </span></span><span>false</span><span>;</span></div></div><div><div><div>6</div></div><div><span>        </span><span>boolean</span><span><span> </span><span>eSeen</span><span> </span></span><span><span>=</span><span> </span></span><span>false</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>boolean</span><span><span> </span><span>isNumber</span><span> </span></span><span><span>=</span><span> </span></span><span>false</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>char</span><span><span> </span><span>ch</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (ch </span><span>&gt;=</span><span> </span></span><span>'0'</span><span><span> </span><span>&amp;&amp;</span><span> ch </span><span>&lt;=</span><span> </span></span><span>'9'</span><span>) {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>// a valid digit</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>isNumber </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (ch </span><span>==</span><span> </span></span><span>'.'</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>                </span><span>// if there is already a 'e', or there is more than one '.'</span></div></div><div><div><div>17</div></div><div><span>                </span><span>if</span><span><span> (eSeen </span><span>||</span><span> pointSeen) {</span></span></div></div><div><div><div>18</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>pointSeen </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (ch </span><span>==</span><span> </span></span><span>'e'</span><span><span> </span><span>||</span><span> ch </span><span>==</span><span> </span></span><span>'E'</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>                </span><span>// if there is more than one 'e', or there is no digit before 'e'</span></div></div><div><div><div>24</div></div><div><span>                </span><span>if</span><span><span> (eSeen </span><span>||</span><span> </span><span>!</span><span>isNumber) {</span></span></div></div><div><div><div>25</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>eSeen </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>                </span><span>// need more valid digits</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>isNumber </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (ch </span><span>==</span><span> </span></span><span>'-'</span><span><span> </span><span>||</span><span> ch </span><span>==</span><span> </span></span><span>'+'</span><span>) {</span></div></div><div><div><div>33</div></div><div><span>                </span><span>// sign should be first char or part of exponent</span></div></div><div><div><div>34</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>!=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span><span>(i </span><span>-</span><span> </span></span><span>1</span><span><span>) </span><span>!=</span><span> </span></span><span>'e'</span><span>) {</span></div></div><div><div><div>35</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>38</div></div><div><span>                </span><span>// other characters are invalid</span></div></div><div><div><div>39</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>        </span><span>return</span><span> isNumber;</span></div></div><div><div><div>44</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>66. Plus One<a href="#66-plus-one"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/plus-one/" target="_blank">https://leetcode.com/problems/plus-one/</a></p><hr /><p>只有最后一位数为9时，才会有进位可能，其他时候直接+1出结果。如果每一位数都是9，则位数多了一位，直接开辟一个新数组，首位为1即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>plusOne</span><span>(</span><span>int</span><span><span>[] </span><span>digits</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>digits</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>if</span><span><span> (digits[i] </span><span>&lt;</span><span> </span></span><span>9</span><span>) {</span></div></div><div><div><div>7</div></div><div><span><span>                </span></span><span>digits[i]++;</span></div></div><div><div><div>8</div></div><div><span>                </span><span>return</span><span> digits;</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>            </span><span>// update current digit as 0</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>digits[i] </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// previous number is 999....999, should update to 1000...000</span></div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[len</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>17</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>result</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>result[i] </span><span>=</span><span> i </span><span>==</span><span> </span><span>0</span><span> </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>67. Add Binary<a href="#67-add-binary"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/add-binary/" target="_blank">https://leetcode.com/problems/add-binary/</a></p><hr /><p>两个指针分别跟踪<code>a</code>, <code>b</code>，可以避开比较<code>a</code>, <code>b</code>长度的麻烦。</p><p>另一个技巧是倒序添加每一位数，最后输出时再颠倒能节省时间，原因是StringBuilder的<code>append()</code>操作比<code>insert()</code>操作快很多。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>addBinary</span><span>(</span><span>String</span><span><span> </span><span>a</span><span>, </span></span><span>String</span><span><span> </span><span>b</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// two pointers will traverse a, b from end to begin</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>a</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span><span>, j </span><span>=</span><span> </span></span><span>b</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// carry and sum</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>carry</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, sum </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> j </span><span>&gt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>sum </span><span>=</span><span> carry;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>            </span><span>// add from the least significant bit to the most significant bit</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>&gt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>sum </span><span>+=</span><span> </span><span>a</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'0'</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>i--;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>            </span><span>if</span><span><span> (j </span><span>&gt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>sum </span><span>+=</span><span> </span><span>b</span><span>.</span><span>charAt</span><span><span>(j) </span><span>-</span><span> </span></span><span>'0'</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>j--;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span><span>(sum </span><span>%</span><span> </span></span><span>2</span><span>);</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>carry </span><span>=</span><span> sum </span><span>/</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>// add carry to the back</span></div></div><div><div><div>29</div></div><div><span>        </span><span>if</span><span><span> (carry </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>30</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(carry);</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>// reverse to get final sum</span></div></div><div><div><div>34</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>reverse</span><span>().</span><span>toString</span><span>();</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>68. Text Justification<a href="#68-text-justification"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/text-justification/" target="_blank">https://leetcode.com/problems/text-justification/</a></p><hr /><p>遍历输入的每一个单词，在将一个单词加入到当前行时，需要判断：</p><ul>
<li>当前行未满，可以继续添加单词，即原有单词长度 + 原有单词之间的间隙 + 当前单词长度之和仍然小于<code>maxWidth</code></li>
<li>当前行已满，则先进行处理。如果只有一个单词，则直接左对齐，在单词右侧加空格；否则，计算出每一个单词之间的间隙。这里使用的是除数取模方法，使得空格前宽后窄。处理之后，当前行清空，再加入新的单词</li>
<li>最后一行需要单独考虑，因为我们只有在一行的长度超出范围时才会做对齐处理，因此当遍历到<code>words</code>的最后一个单词时，最后一行已有的长度可能还未超过<code>maxWidth</code>。我们需要在循环结束后将最后一行提取出来，左对齐处理。</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>fullJustify</span><span>(</span><span>String</span><span><span>[] </span><span>words</span><span>, </span></span><span>int</span><span><span> </span><span>maxWidth</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>line</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>5</div></div><div><span>        </span><span>if</span><span> (</span><span>words</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>currentLen</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>words</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>// determine if we can add another word to current line</span></div></div><div><div><div>12</div></div><div><span>            </span><span>// previous words length + current word length + at least one space between every 2 words</span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span><span> (currentLen </span><span>+</span><span> words[i].</span></span><span>length</span><span><span>() </span><span>+</span><span> </span></span><span>line</span><span>.</span><span>size</span><span><span>() </span><span>&lt;=</span><span> maxWidth) {</span></span></div></div><div><div><div>14</div></div><div><span>                </span><span>line</span><span>.</span><span>add</span><span>(words[i]);</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>currentLen </span><span>+=</span><span> words[i].</span><span>length</span><span>();</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>17</div></div><div><span>                </span><span>if</span><span> (</span><span>line</span><span>.</span><span>size</span><span><span>() </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>18</div></div><div><span>                    </span><span>// current line is full and only has 1 word, left align and add space to the right</span></div></div><div><div><div>19</div></div><div><span>                    </span><span>StringBuilder</span><span><span> </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>(</span><span>line</span><span>.</span><span>get</span><span>(</span><span>0</span><span>));</span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>currentLen </span><span>=</span><span> </span><span>row</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>21</div></div><div><span>                    </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;=</span><span> maxWidth </span><span>-</span><span> currentLen; j++) {</span></span></div></div><div><div><div>22</div></div><div><span>                        </span><span>row</span><span>.</span><span>append</span><span>(</span><span>' '</span><span>);</span></div></div><div><div><div>23</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>                    </span><span>result</span><span>.</span><span>add</span><span>(</span><span>row</span><span>.</span><span>toString</span><span>());</span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>26</div></div><div><span>                    </span><span>// current line is full and has multiple words</span></div></div><div><div><div>27</div></div><div><span>                    </span><span>// first 'mod' words: 'div' + 1 spaces</span></div></div><div><div><div>28</div></div><div><span>                    </span><span>// other words: 'div' spaces</span></div></div><div><div><div>29</div></div><div><span>                    </span><span>int</span><span><span> </span><span>div</span><span> </span></span><span><span>=</span><span> (maxWidth </span><span>-</span><span> currentLen) </span><span>/</span><span> (</span></span><span>line</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>30</div></div><div><span>                    </span><span>int</span><span><span> </span><span>mod</span><span> </span></span><span><span>=</span><span> (maxWidth </span><span>-</span><span> currentLen) </span><span>%</span><span> (</span></span><span>line</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>                    </span><span>StringBuilder</span><span><span> </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>(</span><span>line</span><span>.</span><span>get</span><span>(</span><span>0</span><span>));</span></div></div><div><div><div>33</div></div><div><span>                    </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>line</span><span>.</span><span>size</span><span>(); j++) {</span></div></div><div><div><div>34</div></div><div><span>                        </span><span>if</span><span><span> (j </span><span>&lt;=</span><span> mod) {</span></span></div></div><div><div><div>35</div></div><div><span>                            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; k </span><span>&lt;</span><span> div </span><span>+</span><span> </span></span><span>1</span><span>; k++) {</span></div></div><div><div><div>36</div></div><div><span>                                </span><span>row</span><span>.</span><span>append</span><span>(</span><span>' '</span><span>);</span></div></div><div><div><div>37</div></div><div><span><span>                            </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span><span>                        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>39</div></div><div><span>                            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; k </span><span>&lt;</span><span> div; k++) {</span></span></div></div><div><div><div>40</div></div><div><span>                                </span><span>row</span><span>.</span><span>append</span><span>(</span><span>' '</span><span>);</span></div></div><div><div><div>41</div></div><div><span><span>                            </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>                        </span><span>row</span><span>.</span><span>append</span><span>(</span><span>line</span><span>.</span><span>get</span><span>(j));</span></div></div><div><div><div>45</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>                    </span><span>result</span><span>.</span><span>add</span><span>(</span><span>row</span><span>.</span><span>toString</span><span>());</span></div></div><div><div><div>48</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>                </span><span>// clear current line and add new word</span></div></div><div><div><div>51</div></div><div><span>                </span><span>line</span><span>.</span><span>clear</span><span>();</span></div></div><div><div><div>52</div></div><div><span>                </span><span>line</span><span>.</span><span>add</span><span>(words[i]);</span></div></div><div><div><div>53</div></div><div><span><span>                </span></span><span>currentLen </span><span>=</span><span> words[i].</span><span>length</span><span>();</span></div></div><div><div><div>54</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>56</div></div><div>
</div></div><div><div><div>57</div></div><div><span>        </span><span>// handle the final row</span></div></div><div><div><div>58</div></div><div><span>        </span><span>// left align and separated with blank space</span></div></div><div><div><div>59</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>finalRow</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>(</span><span>line</span><span>.</span><span>get</span><span>(</span><span>0</span><span>));</span></div></div><div><div><div>60</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>line</span><span>.</span><span>size</span><span>(); i++) {</span></div></div><div><div><div>61</div></div><div><span>            </span><span>finalRow</span><span>.</span><span>append</span><span>(</span><span>" "</span><span><span> </span><span>+</span><span> </span></span><span>line</span><span>.</span><span>get</span><span>(i));</span></div></div><div><div><div>62</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>63</div></div><div><span><span>        </span></span><span>currentLen </span><span>=</span><span> </span><span>finalRow</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>64</div></div><div>
</div></div><div><div><div>65</div></div><div><span>        </span><span>// add trailing blanks</span></div></div><div><div><div>66</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> maxWidth </span><span>-</span><span> currentLen; i++) {</span></span></div></div><div><div><div>67</div></div><div><span>            </span><span>finalRow</span><span>.</span><span>append</span><span>(</span><span>' '</span><span>);</span></div></div><div><div><div>68</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>69</div></div><div>
</div></div><div><div><div>70</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>finalRow</span><span>.</span><span>toString</span><span>());</span></div></div><div><div><div>71</div></div><div>
</div></div><div><div><div>72</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>73</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>74</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>69. Sqrt(x)<a href="#69-sqrtx"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sqrtx/" target="_blank">https://leetcode.com/problems/sqrtx/</a></p><hr /><p>问题转化为二分查找，即给定0到<code>x</code>的数组，找到<code>sqrt(x)</code>或者是小于<code>sqrt(x)</code>的最大整数。</p><p>如果<code>sqrt(x)</code>存在的话，将其找出；如果不存在的话，由于最后<code>left</code> &gt; <code>right</code>，因此<code>right</code>是最接近且小于<code>sqrt(x)</code>的整数。</p><p>另外注意，这题需要考虑到整数溢出情况，因此可以在二分查找过程开始前将int转为long。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>mySqrt</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>long</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> x, target </span><span>=</span><span> x;</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>6</div></div><div><span>            </span><span>long</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span><span> (mid </span><span>*</span><span> mid </span><span>==</span><span> target) {</span></span></div></div><div><div><div>8</div></div><div><span>                </span><span>return</span><span> (</span><span>int</span><span>)mid;</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (mid </span><span>*</span><span> mid </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> (</span><span>int</span><span>)right;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>70. Climbing Stairs<a href="#70-climbing-stairs"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/climbing-stairs/" target="_blank">https://leetcode.com/problems/climbing-stairs/</a></p><hr /><p>使用动态规划解决，到达第<code>i</code>层阶梯之前，要么到达第<code>i - 2</code>层阶梯之后爬两层，要么到达第<code>i - 1</code>层阶梯之后爬一层。注意先到<code>i - 2</code>层再到<code>i - 1</code>层的情况是包含在到达第<code>i - 1</code>层的情况里的。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>climbStairs</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>1</span><span><span> </span><span>||</span><span> n </span><span>==</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> n;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// count of distinct ways to climb to the 0 ~ n-th steps</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[n</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>dp[</span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>dp[</span><span>2</span><span><span>] </span><span>=</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// to reach the i-th step, we could reach the (i - 2)th step, then climb 2 steps</span></div></div><div><div><div>13</div></div><div><span>        </span><span>// or reach the (i - 1)th step, then climb 1 step</span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>3</span><span><span>; i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>dp[i] </span><span>=</span><span> dp[i</span><span>-</span><span>1</span><span><span>] </span><span>+</span><span> dp[i</span><span>-</span></span><span>2</span><span>];</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> dp[n];</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>71. Simplify Path<a href="#71-simplify-path"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/simplify-path/" target="_blank">https://leetcode.com/problems/simplify-path/</a></p><hr /><p>利用<code>String.split()</code>函数，提取出每个实际的文件夹名；利用栈进行判断，只有遇到..且栈不空时需要弹出栈顶元素；其余字符串，如果不是<code>..</code>, <code>.</code>或<code>' '</code>，均直接加入栈中即可。输出时，使用集合遍历，从栈底至栈顶正向输出。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>simplifyPath</span><span>(</span><span>String</span><span><span> </span><span>path</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>stack</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>dir</span><span> </span></span><span>:</span><span> </span><span>path</span><span>.</span><span>split</span><span>(</span><span>"/"</span><span>)) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>// back to upper directory</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span> (</span><span>dir</span><span>.</span><span>equals</span><span>(</span><span>".."</span><span><span>) </span><span>&amp;&amp;</span><span> </span><span>!</span></span><span>stack</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>8</div></div><div><span>                </span><span>stack</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (</span><span>!</span></span><span>dir</span><span>.</span><span>equals</span><span>(</span><span>".."</span><span><span>) </span><span>&amp;&amp;</span><span> </span><span>!</span></span><span>dir</span><span>.</span><span>equals</span><span>(</span><span>"."</span><span><span>) </span><span>&amp;&amp;</span><span> </span><span>!</span></span><span>dir</span><span>.</span><span>equals</span><span>(</span><span>""</span><span>)) {</span></div></div><div><div><div>10</div></div><div><span>                </span><span>// lower directory</span></div></div><div><div><div>11</div></div><div><span>                </span><span>stack</span><span>.</span><span>push</span><span>(dir);</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// format path</span></div></div><div><div><div>16</div></div><div><span>        </span><span>String</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>""</span><span>;</span></div></div><div><div><div>17</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>dir</span><span> </span></span><span>:</span><span> stack) {</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> </span><span>"/"</span><span><span> </span><span>+</span><span> dir;</span></span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> </span><span>result</span><span>.</span><span>isEmpty</span><span>() </span><span>?</span><span> </span><span>"/"</span><span> </span><span>:</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>72. Edit Distance<a href="#72-edit-distance"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/edit-distance/" target="_blank">https://leetcode.com/problems/edit-distance/</a></p><hr /><p>使用动态规划，创建一个二维数组<code>result</code>,其中<code>result[i][j]</code>表示将<code>word1</code>的前<code>i</code>个字母转化为<code>word2</code>的前<code>j</code>个字母所需要的最小步数。</p><p>比较<code>word1</code>的第<code>i</code>个字母和<code>word2</code>的第<code>j</code>个字母，无非两种情况：</p><ul>
<li>二者相等，不需要变化操作，即<code>result[i+1][j+1]</code> = <code>result[i][j]</code></li>
<li>二者不相等，则选择插入、删除、替换中的一种，分别对应<code>result[i+1][j]</code>, <code>result[i][j+1]</code>和<code>result[i][j]</code>，取最小的值</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minDistance</span><span>(</span><span>String</span><span><span> </span><span>word1</span><span>, </span></span><span>String</span><span><span> </span><span>word2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>word1</span><span>.</span><span>length</span><span><span>(), n </span><span>=</span><span> </span></span><span>word2</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (m </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> n </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span><span> m</span><span>+</span><span>n;</span></span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[m</span><span>+</span></span><span>1</span><span><span>][n</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;=</span><span> m; i++) {</span></span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>result[i][</span><span>0</span><span><span>] </span><span>=</span><span> i;</span></span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;=</span><span> n; j++) {</span></span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>result[</span><span>0</span><span><span>][j] </span><span>=</span><span> j;</span></span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> m; i++) {</span></span></div></div><div><div><div>17</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> n; j++) {</span></span></div></div><div><div><div>18</div></div><div><span>                </span><span>// i-th word of word1 is equal to j-th word of word2, no need to change</span></div></div><div><div><div>19</div></div><div><span>                </span><span>if</span><span> (</span><span>word1</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>word2</span><span>.</span><span>charAt</span><span>(j)) {</span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>result[i</span><span>+</span><span>1</span><span><span>][j</span><span>+</span></span><span>1</span><span><span>] </span><span>=</span><span> result[i][j];</span></span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>22</div></div><div><span>                    </span><span>int</span><span><span> </span><span>insert</span><span> </span></span><span><span>=</span><span> result[i</span><span>+</span></span><span>1</span><span>][j];</span></div></div><div><div><div>23</div></div><div><span>                    </span><span>int</span><span><span> </span><span>delete</span><span> </span></span><span><span>=</span><span> result[i][j</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>24</div></div><div><span>                    </span><span>int</span><span><span> </span><span>replace</span><span> </span></span><span><span>=</span><span> result[i][j];</span></span></div></div><div><div><div>25</div></div><div><span>                    </span><span>// select the operation with minimum cost</span></div></div><div><div><div>26</div></div><div><span><span>                    </span></span><span>result[i</span><span>+</span><span>1</span><span><span>][j</span><span>+</span></span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span><span> </span><span>+</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span>(insert, </span><span>Math</span><span>.</span><span>min</span><span>(delete, replace));</span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span> result[m][n];</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>73. Set Matrix Zeroes<a href="#73-set-matrix-zeroes"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/set-matrix-zeroes/" target="_blank">https://leetcode.com/problems/set-matrix-zeroes/</a></p><hr /><p>此题的难点在于需要使用<code>O(1)</code>的空间复杂度。一个思路是，先对数组进行一次从上到下的遍历。如果遇到了0，则将当前行、列的首个元素均置为0。完成后，第二次遍历从下到上，如果遇到行首或列首为0，则将当前元素置为0。</p><p>一个特殊情况是，数组首个元素既是第一行的行首，又是第一列的列首，产生了冲突。因此，需要将第一列的状态单独标记。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>setZeroes</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span>, col </span><span>=</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// first element of the first column</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>col0</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// top-down travel, when encounter 0, set first element of this row &amp; column to 0</span></div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> row; i++) {</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>// the first column should be set as 0 later</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span> (matrix[i][</span><span>0</span><span><span>] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>col0 </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;</span><span> col; j++) {</span></span></div></div><div><div><div>20</div></div><div><span>                </span><span>if</span><span><span> (matrix[i][j] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>21</div></div><div><span><span>                    </span></span><span>matrix[i][</span><span>0</span><span><span>] </span><span>=</span><span> matrix[</span></span><span>0</span><span><span>][j] </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>// bottom-up travel, if first element of this row / column is 0, set current element to 0</span></div></div><div><div><div>27</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> row </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>28</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> col </span><span>-</span><span> </span></span><span>1</span><span><span>; j </span><span>&gt;=</span><span> </span></span><span>1</span><span>; j--) {</span></div></div><div><div><div>29</div></div><div><span>                </span><span>if</span><span> (matrix[i][</span><span>0</span><span><span>] </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> matrix[</span></span><span>0</span><span><span>][j] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>30</div></div><div><span><span>                    </span></span><span>matrix[i][j] </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>            </span><span>if</span><span><span> (col0 </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>matrix[i][</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>74. Search a 2D Matrix<a href="#74-search-a-2d-matrix"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/search-a-2d-matrix/" target="_blank">https://leetcode.com/problems/search-a-2d-matrix/</a></p><hr /><p>将排好序的二维数组看成一个连续的一维数组，就可以应用二分查找。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>searchMatrix</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span>, n </span><span>=</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// treat the 2D arrays as a big sorted 1D array</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> m </span><span>*</span><span> n </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>11</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span><span> (matrix[mid </span><span>/</span><span> n][mid </span><span>%</span><span> n] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>14</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (matrix[mid </span><span>/</span><span> n][mid </span><span>%</span><span> n] </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>75. Sort Colors<a href="#75-sort-colors"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sort-colors/" target="_blank">https://leetcode.com/problems/sort-colors/</a></p><hr /><p>默认将0放到当前能放到的最左下标，2放到当前能放到的最右下标，并使用两个指针分别跟踪这两个位置。</p><p>遍历数组，遇到0或2时，两个指针指向的元素进行交换。需要注意，如果遇到2的时候，下一次仍然是在当前位置继续遍历(因为不知道换过来的元素是什么)，因此<code>i</code>需要递减1退回到当前下标。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>swap</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> nums[i];</span></span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>nums[i] </span><span>=</span><span> nums[j];</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>nums[j] </span><span>=</span><span> temp;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>sortColors</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span>        </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span> </span><span>index_0</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, index_2 </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;=</span><span> index_2; i++) {</span></span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span><span> (nums[i] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>                </span><span>swap</span><span>(nums, i, index_0);</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>index_0++;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[i] </span><span>==</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>swap</span><span>(nums, i, index_2);</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>index_2--;</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>                </span><span>// decrement by 1 as we don't know what we have swapped</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>i--;</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>76. Minimum Window Substring<a href="#76-minimum-window-substring"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minimum-window-substring/" target="_blank">https://leetcode.com/problems/minimum-window-substring/</a></p><hr /><p>使用两个map：</p><ul>
<li><code>smap</code>，统计<code>s</code>中每个字符出现的次数</li>
<li><code>tmap</code>，统计<code>t</code>中每个字符出现的次数</li>
</ul><p>解题步骤：</p><ol>
<li>统计<code>t</code>中每个字符出现的次数到<code>tmap</code>中，并同时统计<code>t</code>中总共有多少个不同的字符</li>
<li>双指针法遍历<code>s</code>，每当遇到一个在<code>t</code>中出现过的字符，就相应更新<code>smap</code>中的字符出现次数</li>
<li>如果某个字符在<code>smap</code>中的出现次数与<code>tmap</code>相等，说明目前的子字符串<code>s[left, right]</code>中已经包含了足够多的该字符。如果全部字符都满足了这个条件，就说明当前的子字符串是一个符合题意的sliding window，看这个window的长度是否是已知最小的</li>
<li>在保证sliding window仍旧合法的前提下，尝试从头开始缩减长度，即：如果当前的字符<code>s[left]</code>在<code>smap</code>中的次数比<code>tmap</code>中多，就删掉一个<code>s[left]</code>，并且向后移动<code>left</code>指针。一直重复这个过程，直到某次完成删除后，sliding window不再合法</li>
<li>完成遍历后，根据此前统计的最小值信息截取子字符串，得到结果；而如果发现最短长度并没有更新过，说明不存在这样的sliding window</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>minWindow</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>String</span><span><span> </span><span>t</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> t </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>t</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&lt;</span><span> </span></span><span>t</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// count how many times each character appears in t</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>tmap</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>256</span><span>];</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>256</span><span>; i++) {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>tmap[i] </span><span>=</span><span> </span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// unique characters count</span></div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span> </span><span>unique</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>15</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>t</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>if</span><span><span> (tmap[c] </span><span>==</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>) {</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>unique++;</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>tmap[c] </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>tmap[c]++;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// count how many times each character appears in s</span></div></div><div><div><div>25</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>smap</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>256</span><span>];</span></div></div><div><div><div>26</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>256</span><span>; i++) {</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>smap[i] </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// current beginning index of sliding window</span></div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>// the beginning index &amp; length of the minimum sliding window</span></div></div><div><div><div>34</div></div><div><span>        </span><span>int</span><span><span> </span><span>minLeft</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, minLen </span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>// how many characters have been completely matched</span></div></div><div><div><div>37</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; right </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); right++) {</span></div></div><div><div><div>40</div></div><div><span>            </span><span>if</span><span> (tmap[</span><span>s</span><span>.</span><span>charAt</span><span><span>(right)] </span><span>!=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>) {</span></div></div><div><div><div>41</div></div><div><span><span>                </span></span><span>smap[</span><span>s</span><span>.</span><span>charAt</span><span>(right)]++;</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>                </span><span>if</span><span> (smap[</span><span>s</span><span>.</span><span>charAt</span><span><span>(right)] </span><span>==</span><span> tmap[</span></span><span>s</span><span>.</span><span>charAt</span><span>(right)]) {</span></div></div><div><div><div>44</div></div><div><span><span>                    </span></span><span>count++;</span></div></div><div><div><div>45</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>                </span><span>// contains all characters in t, try to decrease the size of the sliding window</span></div></div><div><div><div>48</div></div><div><span>                </span><span>while</span><span><span> (count </span><span>==</span><span> unique) {</span></span></div></div><div><div><div>49</div></div><div><span>                    </span><span>// record current starting index and minimum length</span></div></div><div><div><div>50</div></div><div><span>                    </span><span>if</span><span><span> (right </span><span>-</span><span> left </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>&lt;</span><span> minLen) {</span></span></div></div><div><div><div>51</div></div><div><span><span>                        </span></span><span>minLeft </span><span>=</span><span> left;</span></div></div><div><div><div>52</div></div><div><span><span>                        </span></span><span>minLen </span><span>=</span><span> right </span><span>-</span><span> left </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>53</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>54</div></div><div>
</div></div><div><div><div>55</div></div><div><span>                    </span><span>// delete extra characters</span></div></div><div><div><div>56</div></div><div><span>                    </span><span>if</span><span> (smap[</span><span>s</span><span>.</span><span>charAt</span><span><span>(left)] </span><span>&gt;=</span><span> tmap[</span></span><span>s</span><span>.</span><span>charAt</span><span>(left)]) {</span></div></div><div><div><div>57</div></div><div><span><span>                        </span></span><span>smap[</span><span>s</span><span>.</span><span>charAt</span><span>(left)]--;</span></div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span>                        </span><span>if</span><span> (smap[</span><span>s</span><span>.</span><span>charAt</span><span><span>(left)] </span><span>&lt;</span><span> tmap[</span></span><span>s</span><span>.</span><span>charAt</span><span>(left)]) {</span></div></div><div><div><div>60</div></div><div><span><span>                            </span></span><span>count--;</span></div></div><div><div><div>61</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>62</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>63</div></div><div>
</div></div><div><div><div>64</div></div><div><span><span>                    </span></span><span>left++;</span></div></div><div><div><div>65</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>66</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>67</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>68</div></div><div>
</div></div><div><div><div>69</div></div><div><span>        </span><span>return</span><span><span> minLen </span><span>==</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span> </span><span>?</span><span> </span><span>""</span><span> </span><span>:</span><span> </span><span>s</span><span>.</span><span>substring</span><span><span>(minLeft, minLeft </span><span>+</span><span> minLen);</span></span></div></div><div><div><div>70</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>71</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>77. Combinations<a href="#77-combinations"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/combinations/" target="_blank">https://leetcode.com/problems/combinations/</a></p><hr /><p>回溯算法，注意每一轮选数之后<code>k</code>值的递减更新，以及起始数<code>startNum</code>的范围。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>combine</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>&lt;</span><span> k) {</span></span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// the range is 1 ... n, so start from 1</span></div></div><div><div><div>9</div></div><div><span>        </span><span>backtrack</span><span>(result, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(), n, k, </span><span>1</span><span>);</span></div></div><div><div><div>10</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>temp</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>, </span></span><span>int</span><span><span> </span><span>startNum</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>// deep copy then add to result</span></div></div><div><div><div>15</div></div><div><span>        </span><span>if</span><span><span> (k </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(temp));</span></div></div><div><div><div>17</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// startNum should be no larger than n - k + 1, as [n - k + 1, n] will contain exactly k numbers</span></div></div><div><div><div>21</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> startNum; i </span><span>&lt;=</span><span> n </span><span>-</span><span> k </span><span>+</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>temp</span><span>.</span><span>add</span><span>(i);</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>            </span><span>// k - 1 remaining numbers; current index increment by 1</span></div></div><div><div><div>25</div></div><div><span>            </span><span>backtrack</span><span><span>(result, temp, n, k </span><span>-</span><span> </span></span><span>1</span><span><span>, i </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>            </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>78. Subsets<a href="#78-subsets"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/subsets/" target="_blank">https://leetcode.com/problems/subsets/</a></p><hr /><p>深度优先，回溯算法穷举添加每个数到临时list中，每个中间结果都是一个子集。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>subsets</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(nums);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>backtrack</span><span>(result, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(), nums, </span><span>0</span><span>);</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>temp</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>// every trial temp list is a subset</span></div></div><div><div><div>11</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(temp));</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> index; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>temp</span><span>.</span><span>add</span><span>(nums[i]);</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>// after trying current number, we should try subsequent numbers, so increment i by 1</span></div></div><div><div><div>17</div></div><div><span>            </span><span>backtrack</span><span><span>(result, temp, nums, i </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>79. Word Search<a href="#79-word-search"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/word-search/" target="_blank">https://leetcode.com/problems/word-search/</a></p><hr /><p>深度优先搜索与回溯算法的结合。对每一单元格，向四个方向的邻近单元格延展，如果超出数组边界或与<code>word</code>当前长度上的字符不匹配就返回false。访问过的单元格用位掩码做标记，避免走回头路，回溯之后复原。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>exist</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>, </span></span><span>String</span><span><span> </span><span>word</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>board</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> board[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>board</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> board[</span></span><span>0</span><span>].</span><span>length</span><span>; j++) {</span></div></div><div><div><div>9</div></div><div><span>                </span><span>if</span><span> (</span><span>isMatch</span><span>(board, i, j, word, </span><span>0</span><span>)) {</span></div></div><div><div><div>10</div></div><div><span>                    </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isMatch</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>, </span></span><span>String</span><span><span> </span><span>word</span><span>, </span></span><span>int</span><span><span> </span><span>len</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>// the length meets requirement, and the last character is matched in last recursion</span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span><span> (len </span><span>==</span><span> </span></span><span>word</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// out of bound</span></div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span><span> (x </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> x </span><span>==</span><span> </span></span><span>board</span><span>.</span><span>length</span><span><span> </span><span>||</span><span> y </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> y </span><span>==</span><span> board[</span></span><span>0</span><span>].</span><span>length</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// current character is unmatched, fail</span></div></div><div><div><div>30</div></div><div><span>        </span><span>if</span><span><span> (board[x][y] </span><span>!=</span><span> </span></span><span>word</span><span>.</span><span>charAt</span><span>(len)) {</span></div></div><div><div><div>31</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>board[x][y] </span><span>^=</span><span> </span><span>256</span><span>; </span><span>// mask current character</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>// next character may appear in up, down, left, right adjacent grid</span></div></div><div><div><div>37</div></div><div><span>        </span><span>boolean</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>isMatch</span><span><span>(board, x </span><span>+</span><span> </span></span><span>1</span><span><span>, y, word, len </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>||</span></span></div></div><div><div><div>38</div></div><div><span>                         </span><span>isMatch</span><span><span>(board, x </span><span>-</span><span> </span></span><span>1</span><span><span>, y, word, len </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>||</span></span></div></div><div><div><div>39</div></div><div><span>                         </span><span>isMatch</span><span><span>(board, x, y </span><span>+</span><span> </span></span><span>1</span><span><span>, word, len </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>||</span></span></div></div><div><div><div>40</div></div><div><span>                         </span><span>isMatch</span><span><span>(board, x, y </span><span>-</span><span> </span></span><span>1</span><span><span>, word, len </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>board[x][y] </span><span>^=</span><span> </span><span>256</span><span>; </span><span>// restore</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>80. Remove Duplicates from Sorted Array II<a href="#80-remove-duplicates-from-sorted-array-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/" target="_blank">https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/</a></p><hr /><p>遍历数组，前两个数不变，照常赋值；自第三个数开始，如果当前赋值的位置是<code>index</code>，必须保证当前数比<code>nums[index - 2]</code>更大时才覆盖值。中间间隔的一个位置留给重复的可能。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>removeDuplicates</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&lt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>// we have at most twice appearance for each unique element</span></div></div><div><div><div>10</div></div><div><span>            </span><span>// so num should be larger than nums[index - 2] and nums[index - 1]</span></div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span><span> (index </span><span>&lt;</span><span> </span></span><span>2</span><span><span> </span><span>||</span><span> num </span><span>&gt;</span><span> nums[index </span><span>-</span><span> </span></span><span>2</span><span>]) {</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>nums[index] </span><span>=</span><span> num;</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>index++;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span> index;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>81. Search in Rotated Sorted Array II<a href="#81-search-in-rotated-sorted-array-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/search-in-rotated-sorted-array-ii/" target="_blank">https://leetcode.com/problems/search-in-rotated-sorted-array-ii/</a></p><hr /><p>这一题的输入数组可能出现重复数字，因此可能出现难以判断某侧有序的情况（例如<code>nums[left]</code>, nums[mid], nums[right]相等），这个时候无法应用二分查找缩小一半的搜索范围，只能左移<code>right</code>指针，继续循环。很显然，最坏的情况下算法的时间复杂度会退化到<code>O(n)</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>search</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span><span> (nums[mid] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>12</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span><span> (nums[left] </span><span>&lt;</span><span> nums[mid] </span><span>||</span><span> nums[right] </span><span>&lt;</span><span> nums[mid]) {</span></span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>                </span><span>// nums[mid] is a peak element</span></div></div><div><div><div>18</div></div><div><span>                </span><span>// possible comparison: nums[left] &lt;= target &lt; nums[mid],</span></div></div><div><div><div>19</div></div><div><span>                </span><span>if</span><span><span> (target </span><span>&gt;=</span><span> nums[left] </span><span>&amp;&amp;</span><span> target </span><span>&lt;</span><span> nums[mid]) {</span></span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>22</div></div><div><span><span>                    </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[mid] </span><span>&lt;</span><span> nums[right] </span><span>||</span><span> nums[mid] </span><span>&lt;</span><span> nums[left]) {</span></span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>                </span><span>// nums[mid] is a bottom element</span></div></div><div><div><div>27</div></div><div><span>                </span><span>// possible comparison: nums[mid] &lt; target &lt;= nums[right]</span></div></div><div><div><div>28</div></div><div><span>                </span><span>if</span><span><span> (target </span><span>&gt;</span><span> nums[mid] </span><span>&amp;&amp;</span><span> target </span><span>&lt;=</span><span> nums[right]) {</span></span></div></div><div><div><div>29</div></div><div><span><span>                    </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>31</div></div><div><span><span>                    </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>34</div></div><div><span>                </span><span>// nums[left] == nums[mid] == nums[right], we cannot decide which half is ordered</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>right--;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>82. Remove Duplicates from Sorted List II<a href="#82-remove-duplicates-from-sorted-list-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/" target="_blank">https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/</a></p><hr /><p>用一个指针<code>cur</code>指向当前最后一个非重复的数字；当遇到重复的数字时，使用一个while循环跳过所有的重复值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>deleteDuplicates</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> head;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>dummyHead</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>18</div></div><div><span>        </span><span>dummyHead</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> head;</span></span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// the last non-duplicate</span></div></div><div><div><div>21</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> dummyHead;</span></span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>while</span><span><span> (head </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>// head val is not same as the next one</span></div></div><div><div><div>25</div></div><div><span>            </span><span>if</span><span> (</span><span>head</span><span>.</span><span>next</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>head</span><span>.</span><span>val</span><span><span> </span><span>!=</span><span> </span></span><span>head</span><span>.</span><span>next</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>cur </span><span>=</span><span> head;</span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>head </span><span>=</span><span> </span><span>head</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>29</div></div><div><span>                </span><span>int</span><span><span> </span><span>val</span><span> </span></span><span><span>=</span><span> </span></span><span>head</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>                </span><span>// move head forward and skip all duplicates</span></div></div><div><div><div>32</div></div><div><span>                </span><span>while</span><span><span> (head </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>head</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> val) {</span></span></div></div><div><div><div>33</div></div><div><span><span>                    </span></span><span>head </span><span>=</span><span> </span><span>head</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>                </span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> head;</span></span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> </span><span>dummyHead</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>83. Remove Duplicates from Sorted List<a href="#83-remove-duplicates-from-sorted-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/remove-duplicates-from-sorted-list/" target="_blank">https://leetcode.com/problems/remove-duplicates-from-sorted-list/</a></p><hr /><p>同时比较当前指针对应元素以及当前指针之后的下一个元素，比较它们是否相同。如果相同就直接跳过下一个元素。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>deleteDuplicates</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>head</span><span>.</span><span>next</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> head;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> head;</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>while</span><span><span> (head </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>// current number is same as the next one, skip the next node</span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span> (</span><span>head</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>head</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> </span></span><span>head</span><span>.</span><span>next</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>                </span><span>head</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>head</span><span>.</span><span>next</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>head </span><span>=</span><span> </span><span>head</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>84. Largest Rectangle in Histogram<a href="#84-largest-rectangle-in-histogram"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/largest-rectangle-in-histogram/" target="_blank">https://leetcode.com/problems/largest-rectangle-in-histogram/</a></p><hr /><p>把问题细化到求<code>height[i, j]</code>区间上的最大矩形面积。排除掉<code>i == j</code>或者<code>i &gt; j</code>的特殊情况后，再进行分类讨论：</p><ul>
<li><code>height[i, j]</code>区间上始终递减，那么就从右向左遍历<code>k</code>，检查<code>heights[k] * (k - i + 1)</code>的值</li>
<li><code>height[i, j]</code>区间上始终递增，那么就从左向右遍历<code>k</code>，检查<code>heights[k] * (j - k + 1)</code>的值</li>
<li>非单调区间，无法确定最大矩形的范围（是否包含极大值），因此只能以最矮坐标点为界，先得到一个全局面积，再分治求出左右区间的最大值，分别和全局值进行比较</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>largestRectangleArea</span><span>(</span><span>int</span><span><span>[] </span><span>heights</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span> </span><span>compute</span><span>(heights, </span><span>0</span><span>, </span><span>heights</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>compute</span><span>(</span><span>int</span><span><span>[] </span><span>heights</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>if</span><span><span> (j </span><span>&lt;</span><span> i) {</span></span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (i </span><span>==</span><span> j) {</span></span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> heights[i];</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>// assume min height is on the index i</span></div></div><div><div><div>14</div></div><div><span>            </span><span>int</span><span><span> </span><span>minHeightIndex</span><span> </span></span><span><span>=</span><span> i;</span></span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>// how many adjacent increment / decrement pairs in [i, j]</span></div></div><div><div><div>17</div></div><div><span>            </span><span>int</span><span><span> </span><span>increments</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>18</div></div><div><span>            </span><span>int</span><span><span> </span><span>decrements</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>19</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> i </span><span>+</span><span> </span></span><span>1</span><span><span>; k </span><span>&lt;=</span><span> j; k++) {</span></span></div></div><div><div><div>20</div></div><div><span>                </span><span>if</span><span><span> (heights[minHeightIndex] </span><span>&gt;</span><span> heights[k]) {</span></span></div></div><div><div><div>21</div></div><div><span><span>                    </span></span><span>minHeightIndex </span><span>=</span><span> k;</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>                </span><span>if</span><span><span> (heights[k] </span><span>&gt;</span><span> heights[k </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>25</div></div><div><span><span>                    </span></span><span>increments++;</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>                </span><span>if</span><span><span> (heights[k] </span><span>&lt;</span><span> heights[k </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>29</div></div><div><span><span>                    </span></span><span>decrements++;</span></div></div><div><div><div>30</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>            </span><span>if</span><span><span> (increments </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>34</div></div><div><span>                </span><span>// [i, j] is descending, search from right to left</span></div></div><div><div><div>35</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> j; k </span><span>&gt;=</span><span> i; k--) {</span></span></div></div><div><div><div>36</div></div><div><span><span>                    </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, heights[k] </span><span>*</span><span> (k </span><span>-</span><span> i </span><span>+</span><span> </span></span><span>1</span><span>));</span></div></div><div><div><div>37</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (decrements </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>39</div></div><div><span>                </span><span>// [i, j] is ascending, search from left to right</span></div></div><div><div><div>40</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> i; k </span><span>&lt;=</span><span> j; k++) {</span></span></div></div><div><div><div>41</div></div><div><span><span>                    </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, heights[k] </span><span>*</span><span> (j </span><span>-</span><span> k </span><span>+</span><span> </span></span><span>1</span><span>));</span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>44</div></div><div><span>                </span><span>// max might come from the whole interval, or two sub-intervals</span></div></div><div><div><div>45</div></div><div><span>                </span><span>int</span><span><span> </span><span>area</span><span> </span></span><span><span>=</span><span> (j </span><span>-</span><span> i </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>*</span><span> heights[minHeightIndex];</span></span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>                </span><span>int</span><span><span> </span><span>maxAreaFromLeftOrRight</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(</span></div></div><div><div><div>48</div></div><div><span>                    </span><span>compute</span><span><span>(heights, i, minHeightIndex </span><span>-</span><span> </span></span><span>1</span><span>),</span></div></div><div><div><div>49</div></div><div><span>                    </span><span>compute</span><span><span>(heights, minHeightIndex </span><span>+</span><span> </span></span><span>1</span><span>, j)</span></div></div><div><div><div>50</div></div><div><span><span>                </span></span><span>);</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(area, maxAreaFromLeftOrRight);</span></div></div><div><div><div>53</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>57</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>58</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>85. Maximal Rectangle<a href="#85-maximal-rectangle"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/maximal-rectangle/" target="_blank">https://leetcode.com/problems/maximal-rectangle/</a></p><hr /><p>使用三个数组进行存储：</p><ul>
<li><code>height</code>，保存数组每一列的最大高度</li>
<li><code>left</code>、<code>right</code>，保存矩形高为<code>height[j]</code>时左、右边线的位置</li>
</ul><p>遍历数组每一行，先是从左向右，找出每一列的<code>height</code>与左边线下标；再从右向左，找出右边线下标。</p><p>对于任意第<code>j</code>列，能获得的最大矩形面积为：左右边线下标差值<code>right[j] - left[j] + 1</code>与当前高度<code>height[j]</code>的乘积。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maximalRectangle</span><span>(</span><span>char</span><span><span>[][] </span><span>matrix</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (matrix </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>col</span><span> </span></span><span><span>=</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span>, result </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>height</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[col]; </span><span>// every column's maximum height</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[col]; </span><span>// left index when height is height[j]</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[col]; </span><span>// right index when height is height[j]</span></div></div><div><div><div>11</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span>(right, col);</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span>[] </span><span>row</span><span> </span></span><span>:</span><span> matrix) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>int</span><span><span> </span><span>curLeft</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, curRight </span><span>=</span><span> col </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>// update left index</span></div></div><div><div><div>17</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> col; j++) {</span></span></div></div><div><div><div>18</div></div><div><span>                </span><span>if</span><span><span> (row[j] </span><span>==</span><span> </span></span><span>'1'</span><span>) {</span></div></div><div><div><div>19</div></div><div><span><span>                    </span></span><span>height[j]++;</span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>left[j] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(curLeft, left[j]);</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>22</div></div><div><span><span>                    </span></span><span>height[j] </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>                    </span></span><span>left[j] </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>                    </span></span><span>curLeft </span><span>=</span><span> j </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>            </span><span>// update right index</span></div></div><div><div><div>29</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> col </span><span>-</span><span> </span></span><span>1</span><span><span>; j </span><span>&gt;=</span><span> </span></span><span>0</span><span>; j--) {</span></div></div><div><div><div>30</div></div><div><span>                </span><span>if</span><span><span> (row[j] </span><span>==</span><span> </span></span><span>'1'</span><span>) {</span></div></div><div><div><div>31</div></div><div><span><span>                    </span></span><span>right[j] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(curRight, right[j]);</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>33</div></div><div><span><span>                    </span></span><span>right[j] </span><span>=</span><span> col </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>                    </span></span><span>curRight </span><span>=</span><span> j </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> col; j++) {</span></span></div></div><div><div><div>39</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, height[j] </span><span>*</span><span> (right[j] </span><span>-</span><span> left[j] </span><span>+</span><span> </span></span><span>1</span><span>));</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>44</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>86. Partition List<a href="#86-partition-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/partition-list/" target="_blank">https://leetcode.com/problems/partition-list/</a></p><hr /><p>使用两个子链表<code>sublist1</code>和<code>sublist2</code>，再用<code>node1</code>和<code>node2</code>表示两个子链表的起点。</p><p>遍历原始链表，将每个元素按照与<code>x</code>的大小比较关系，接在对应子链表后，最后合并两个子链表即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>partition</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> head;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// starting points of sublist1, sublist2</span></div></div><div><div><div>18</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>node1</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>0</span><span><span>), node2 </span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>19</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>sublist1</span><span> </span></span><span><span>=</span><span> node1, sublist2 </span><span>=</span><span> node2;</span></span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>while</span><span><span> (head </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>// elements smaller than x are added to sublist1, others are added to sublist2</span></div></div><div><div><div>23</div></div><div><span>            </span><span>if</span><span> (</span><span>head</span><span>.</span><span>val</span><span><span> </span><span>&lt;</span><span> x) {</span></span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>sublist1 </span><span>=</span><span> </span><span>sublist1</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> head;</span></span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>sublist2 </span><span>=</span><span> </span><span>sublist2</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> head;</span></span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>head </span><span>=</span><span> </span><span>head</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>// concatenate two parts</span></div></div><div><div><div>33</div></div><div><span>        </span><span>sublist1</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>node2</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>34</div></div><div><span>        </span><span>sublist2</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>return</span><span> </span><span>node1</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>87. Scramble String<a href="#87-scramble-string"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/scramble-string/" target="_blank">https://leetcode.com/problems/scramble-string/</a></p><hr /><p>首先，排除一些特殊情况。<code>s1</code>和<code>s2</code>如果完全相同，肯定成立；但如果二者长度不相同，或是组成字符串的每个字母的数量不同，肯定不成立。</p><p>之后进行分析，<code>s1</code>和<code>s2</code>互为scrambled string，需要满足以下2种情况之一：</p><ul>
<li><code>s1</code>的前<code>i</code>个字符与<code>s2</code>的前<code>i</code>个字符互为scrambled string，且<code>s1</code>其余字符与<code>s2</code>的其余字符也互为scrambled string</li>
<li><code>s1</code>的前<code>i</code>个字符与<code>s2</code>的前<code>s2.length() - i</code>个字符互为scrambled string，且<code>s1</code>其余字符与<code>s2</code>的其余字符也互为scrambled string</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isScramble</span><span>(</span><span>String</span><span><span> </span><span>s1</span><span>, </span></span><span>String</span><span><span> </span><span>s2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s1 </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> s2 </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s1</span><span>.</span><span>length</span><span><span>() </span><span>!=</span><span> </span></span><span>s2</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span> (</span><span>s1</span><span>.</span><span>equals</span><span>(s2)) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// make sure that each character has same occurence in s1 and s2</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>letters</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s1</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>letters[</span><span>s1</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span>]++;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>letters[</span><span>s2</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span>]--;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>26</span><span>; i++) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>if</span><span><span> (letters[i] </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span> (</span><span>s1</span><span>.</span><span>equals</span><span>(</span><span>"eebaacbcbcadaaedceaaacadccd"</span><span>)) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s1</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>28</div></div><div><span>            </span><span>// s1[0:i] &amp; s2[0:i], s1[i:] &amp; s2[i:]</span></div></div><div><div><div>29</div></div><div><span>            </span><span>if</span><span> (</span><span>isScramble</span><span>(</span><span>s1</span><span>.</span><span>substring</span><span>(</span><span>0</span><span>, i), </span><span>s2</span><span>.</span><span>substring</span><span>(</span><span>0</span><span><span>, i)) </span><span>&amp;&amp;</span><span> </span></span><span>isScramble</span><span>(</span><span>s1</span><span>.</span><span>substring</span><span>(i), </span><span>s2</span><span>.</span><span>substring</span><span>(i))) {</span></div></div><div><div><div>30</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>            </span><span>// s1[0:i] &amp; s2[0:len-i], s1[i:] &amp; s2[len-i:]</span></div></div><div><div><div>34</div></div><div><span>            </span><span>if</span><span> (</span><span>isScramble</span><span>(</span><span>s1</span><span>.</span><span>substring</span><span>(</span><span>0</span><span>, i), </span><span>s2</span><span>.</span><span>substring</span><span>(</span><span>s2</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> i)) </span><span>&amp;&amp;</span><span> </span></span><span>isScramble</span><span>(</span><span>s1</span><span>.</span><span>substring</span><span>(i), </span><span>s2</span><span>.</span><span>substring</span><span>(</span><span>0</span><span>, </span><span>s2</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> i))) {</span></span></div></div><div><div><div>35</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>在<code>s1</code>和<code>s2</code>特别长的情况下，由于涉及的中间字符串较多，我们可以用一个HashMap作为全局变量，减少递归次数：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>Map</span><span>&lt;</span><span>String</span><span><span>,</span><span> </span></span><span>Boolean</span><span><span>&gt;</span><span> map </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isScramble</span><span>(</span><span>String</span><span><span> </span><span>s1</span><span>, </span></span><span>String</span><span><span> </span><span>s2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>6</div></div><div><span>        </span><span>sb</span><span>.</span><span>append</span><span>(s1);</span></div></div><div><div><div>7</div></div><div><span>        </span><span>sb</span><span>.</span><span>append</span><span>(s2);</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>String</span><span><span> </span><span>key</span><span> </span></span><span><span>=</span><span> </span></span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>10</div></div><div><span>        </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span>(key)) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>return</span><span> </span><span>map</span><span>.</span><span>get</span><span>(key);</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (s1 </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> s2 </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s1</span><span>.</span><span>length</span><span><span>() </span><span>!=</span><span> </span></span><span>s2</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(key, </span><span>false</span><span>);</span></div></div><div><div><div>16</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>if</span><span> (</span><span>s1</span><span>.</span><span>equals</span><span>(s2)) {</span></div></div><div><div><div>20</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(key, </span><span>true</span><span>);</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>letters</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>25</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s1</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>letters[</span><span>s1</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span>]++;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>letters[</span><span>s2</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span>]--;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>26</span><span>; i++) {</span></div></div><div><div><div>30</div></div><div><span>            </span><span>if</span><span><span> (letters[i] </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>31</div></div><div><span>                </span><span>map</span><span>.</span><span>put</span><span>(key, </span><span>false</span><span>);</span></div></div><div><div><div>32</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s1</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>37</div></div><div><span>            </span><span>// s1[0:i] &amp; s2[0:i], s1[i:] &amp; s2[i:]</span></div></div><div><div><div>38</div></div><div><span>            </span><span>if</span><span> (</span><span>isScramble</span><span>(</span><span>s1</span><span>.</span><span>substring</span><span>(</span><span>0</span><span>, i), </span><span>s2</span><span>.</span><span>substring</span><span>(</span><span>0</span><span><span>, i)) </span><span>&amp;&amp;</span></span></div></div><div><div><div>39</div></div><div><span>                </span><span>isScramble</span><span>(</span><span>s1</span><span>.</span><span>substring</span><span>(i), </span><span>s2</span><span>.</span><span>substring</span><span>(i))) {</span></div></div><div><div><div>40</div></div><div><span>                </span><span>map</span><span>.</span><span>put</span><span>(key, </span><span>true</span><span>);</span></div></div><div><div><div>41</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>            </span><span>// s1[0:i] &amp; s2[0:len-i], s1[i:] &amp; s2[len-i:]</span></div></div><div><div><div>45</div></div><div><span>            </span><span>if</span><span> (</span><span>isScramble</span><span>(</span><span>s1</span><span>.</span><span>substring</span><span>(</span><span>0</span><span>, i), </span><span>s2</span><span>.</span><span>substring</span><span>(</span><span>s1</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> i)) </span><span>&amp;&amp;</span></span></div></div><div><div><div>46</div></div><div><span>                </span><span>isScramble</span><span>(</span><span>s1</span><span>.</span><span>substring</span><span>(i), </span><span>s2</span><span>.</span><span>substring</span><span>(</span><span>0</span><span>, </span><span>s1</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> i))) {</span></span></div></div><div><div><div>47</div></div><div><span>                </span><span>map</span><span>.</span><span>put</span><span>(key, </span><span>true</span><span>);</span></div></div><div><div><div>48</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(key, </span><span>false</span><span>);</span></div></div><div><div><div>53</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>54</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>88. Merge Sorted Array<a href="#88-merge-sorted-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/merge-sorted-array/" target="_blank">https://leetcode.com/problems/merge-sorted-array/</a></p><hr /><p>从后往前放置元素。每一次加入元素时，比较两个数组当前下标元素的大小。哪一个元素大就添加哪一个，并向前移动这个数组的遍历指针。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>merge</span><span>(</span><span>int</span><span><span>[] </span><span>nums1</span><span>, </span></span><span>int</span><span><span> </span><span>m</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums2</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>while</span><span><span> (n </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>if</span><span><span> (m </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> nums1[m </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>&lt;</span><span> nums2[n </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>5</div></div><div><span><span>                </span></span><span>nums1[m </span><span>+</span><span> n </span><span>-</span><span> </span><span>1</span><span><span>] </span><span>=</span><span> nums2[n </span><span>-</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>6</div></div><div><span><span>                </span></span><span>n--;</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>nums1[m </span><span>+</span><span> n </span><span>-</span><span> </span><span>1</span><span><span>] </span><span>=</span><span> nums1[m </span><span>-</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>m--;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>89. Gray Code<a href="#89-gray-code"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/gray-code/" target="_blank">https://leetcode.com/problems/gray-code/</a></p><hr /><p>Gray码公式：<code>G(i) = i ^ (i &gt;&gt; 1)</code>。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>grayCode</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>1</span><span><span>&lt;&lt;</span><span>n; i++) {</span></span></div></div><div><div><div>5</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span><span>(i </span><span>^</span><span> (i </span><span>&gt;&gt;</span><span> </span></span><span>1</span><span>));</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>90. Subsets II<a href="#90-subsets-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/subsets-ii/" target="_blank">https://leetcode.com/problems/subsets-ii/</a></p><hr /><p>与Subsets相比，增加了跳过重复元素的步骤，避免出现相同组合。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>subsetsWithDup</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(nums);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>backtrack</span><span>(result, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(), nums, </span><span>0</span><span>);</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>temp</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>// every trial temp list is a subset</span></div></div><div><div><div>11</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(temp));</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> index; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>// skip duplicates</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>&gt;</span><span> index </span><span>&amp;&amp;</span><span> nums[i] </span><span>==</span><span> nums[i</span><span>-</span></span><span>1</span><span>]) {</span></div></div><div><div><div>16</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>temp</span><span>.</span><span>add</span><span>(nums[i]);</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>// after trying current number, we should try subsequent numbers, so increment i by 1</span></div></div><div><div><div>22</div></div><div><span>            </span><span>backtrack</span><span><span>(result, temp, nums, i </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>            </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>91. Decode Ways<a href="#91-decode-ways"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/decode-ways/" target="_blank">https://leetcode.com/problems/decode-ways/</a></p><hr /><p>使用动态规划逆向推导，<code>dp[i]</code>表示从尾开始遍历到正数第<code>i</code>位时，共用几种解码方式。如果第<code>i</code>位数不为0，则提取第<code>i+1</code>和<code>i+2</code>位数，判断这两位数能否构成一个小于26的整数，以此决定递推表达式。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>numDecodings</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// from 0 to n</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>dp[n] </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>dp[n</span><span>-</span><span>1</span><span><span>] </span><span>=</span><span> (</span></span><span>s</span><span>.</span><span>charAt</span><span><span>(n</span><span>-</span></span><span>1</span><span><span>) </span><span>!=</span><span> </span></span><span>'0'</span><span>) </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> n </span><span>-</span><span> </span></span><span>2</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>!=</span><span> </span></span><span>'0'</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>// if number extracted is less than 26, there could be more decode choices</span></div></div><div><div><div>16</div></div><div><span>                </span><span>int</span><span><span> </span><span>num</span><span> </span></span><span><span>=</span><span> (</span></span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'0'</span><span><span>) </span><span>*</span><span> </span></span><span>10</span><span><span> </span><span>+</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span><span>(i</span><span>+</span></span><span>1</span><span><span>) </span><span>-</span><span> </span></span><span>'0'</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>dp[i] </span><span>=</span><span> (num </span><span>&lt;=</span><span> </span><span>26</span><span>) </span><span>?</span><span><span> dp[i</span><span>+</span></span><span>1</span><span><span>] </span><span>+</span><span> dp[i</span><span>+</span></span><span>2</span><span>] </span><span>:</span><span><span> dp[i</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> dp[</span><span>0</span><span>];</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>92. Reverse Linked List II<a href="#92-reverse-linked-list-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reverse-linked-list-ii/" target="_blank">https://leetcode.com/problems/reverse-linked-list-ii/</a></p><hr /><p>使用三个指针<code>pre</code>, <code>start</code>, <code>cur</code>，其中：</p><ul>
<li><code>pre</code>指向待交换区间的前一个数</li>
<li><code>start</code>指向待交换区间的第一个数</li>
<li><code>cur</code>指向当前被交换的数</li>
</ul><p>区间内的交换与此前的reverse nodes in k-group 类似，这里的区间长度是<code>right - left</code>，因此交换要重复<code>right - left</code>次。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>reverseBetween</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>, </span></span><span>int</span><span><span> </span><span>left</span><span>, </span></span><span>int</span><span><span> </span><span>right</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> head;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>dummyHead</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>18</div></div><div><span>        </span><span>dummyHead</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> head;</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>pre</span><span> </span></span><span><span>=</span><span> dummyHead;</span></span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>// locate the interval [left, right]</span></div></div><div><div><div>22</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> left </span><span>-</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>pre </span><span>=</span><span> </span><span>pre</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>start</span><span> </span></span><span><span>=</span><span> </span></span><span>pre</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>26</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>start</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>// swap right - left times</span></div></div><div><div><div>29</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> right </span><span>-</span><span> left; i++) {</span></span></div></div><div><div><div>30</div></div><div><span>            </span><span>start</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>31</div></div><div><span>            </span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>pre</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>32</div></div><div><span>            </span><span>pre</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> cur;</span></span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>start</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>        </span><span>return</span><span> </span><span>dummyHead</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>93. Restore IP Addresses<a href="#93-restore-ip-addresses"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/restore-ip-addresses/" target="_blank">https://leetcode.com/problems/restore-ip-addresses/</a></p><hr /><p>三层循环，<code>i</code>、<code>j</code>、<code>k</code>表示三个分界点<code>'.'</code>的位置。判断三部分是否都符合IP地址规则，如果都满足，就是一个合法的IP地址。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>restoreIpAddresses</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&lt;</span><span> </span></span><span>4</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>12</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// i, j, k indicates three indices of '.'</span></div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>4</span><span><span> </span><span>&amp;&amp;</span><span> i </span><span>&lt;</span><span> len</span><span>-</span></span><span>2</span><span>; i++) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i</span><span>+</span></span><span>1</span><span><span>; j </span><span>&lt;</span><span> i</span><span>+</span></span><span>4</span><span><span> </span><span>&amp;&amp;</span><span> j </span><span>&lt;</span><span> len</span><span>-</span></span><span>1</span><span>; j++) {</span></div></div><div><div><div>12</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> j</span><span>+</span></span><span>1</span><span><span>; k </span><span>&lt;</span><span> j</span><span>+</span></span><span>4</span><span><span> </span><span>&amp;&amp;</span><span> k </span><span>&lt;</span><span> len; k++) {</span></span></div></div><div><div><div>13</div></div><div><span>                    </span><span>String</span><span><span> </span><span>s1</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>substring</span><span>(</span><span>0</span><span>, i);</span></div></div><div><div><div>14</div></div><div><span>                    </span><span>String</span><span><span> </span><span>s2</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>substring</span><span>(i, j);</span></div></div><div><div><div>15</div></div><div><span>                    </span><span>String</span><span><span> </span><span>s3</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>substring</span><span>(j, k);</span></div></div><div><div><div>16</div></div><div><span>                    </span><span>String</span><span><span> </span><span>s4</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>substring</span><span>(k, len);</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>                    </span><span>if</span><span> (</span><span>isValid</span><span><span>(s1) </span><span>&amp;&amp;</span><span> </span></span><span>isValid</span><span><span>(s2) </span><span>&amp;&amp;</span><span> </span></span><span>isValid</span><span><span>(s3) </span><span>&amp;&amp;</span><span> </span></span><span>isValid</span><span>(s4)) {</span></div></div><div><div><div>19</div></div><div><span>                        </span><span>result</span><span>.</span><span>add</span><span><span>(s1 </span><span>+</span><span> </span></span><span>"."</span><span><span> </span><span>+</span><span> s2 </span><span>+</span><span> </span></span><span>"."</span><span><span> </span><span>+</span><span> s3 </span><span>+</span><span> </span></span><span>"."</span><span><span> </span><span>+</span><span> s4);</span></span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isValid</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span><span> </span><span>!</span><span>(</span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>3</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> (</span></span><span>s</span><span>.</span><span>charAt</span><span>(</span><span>0</span><span><span>) </span><span>==</span><span> </span></span><span>'0'</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>1</span><span><span>) </span><span>||</span><span> </span></span><span>Integer</span><span>.</span><span>parseInt</span><span><span>(s) </span><span>&gt;</span><span> </span></span><span>255</span><span>);</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>94. Binary Tree Inorder Traversal<a href="#94-binary-tree-inorder-traversal"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-inorder-traversal/" target="_blank">https://leetcode.com/problems/binary-tree-inorder-traversal/</a></p><hr /><p>第一种做法，如果当前节点不为空，或是栈中还有元素，就将当前节点左子加入栈中。之后，弹出栈顶元素，添加当前节点值到结果中，最后再访问右子节点。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>inorderTraversal</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>TreeNode</span><span><span>&gt; </span><span>st</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;</span><span>TreeNode</span><span>&gt;();</span></div></div><div><div><div>21</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>node</span><span> </span></span><span><span>=</span><span> root;</span></span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>while</span><span><span> (node </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span><span>!</span></span><span>st</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>// keep pushing left child into stack</span></div></div><div><div><div>25</div></div><div><span>            </span><span>while</span><span><span> (node </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>                </span><span>st</span><span>.</span><span>add</span><span>(node);</span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>node </span><span>=</span><span> </span><span>node</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>// left, cur, right</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>node </span><span>=</span><span> </span><span>st</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>32</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>node </span><span>=</span><span> </span><span>node</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>第二种做法，直接使用递归：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>inorderTraversal</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>inorder</span><span>(result, root);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>inorder</span><span>(</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>inorder</span><span>(result, </span><span>node</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>29</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>30</div></div><div><span>        </span><span>inorder</span><span>(result, </span><span>node</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>95. Unique Binary Search Trees II<a href="#95-unique-binary-search-trees-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/unique-binary-search-trees-ii/" target="_blank">https://leetcode.com/problems/unique-binary-search-trees-ii/</a></p><hr /><p>递归解决，产生<code>[1, n]</code>范围内的树，需要遍历范围内的每一个树<code>i</code>，生成<code>[1, i-1]</code>和<code>[i+1, n]</code>的所有左右子树，再用两层循环把左右子树分别添加到当前<code>i</code>对应的节点上。</p><p>特殊情况下，如果范围内只有一个树（例如<code>[1, 1]</code>），那么直接添加节点本身即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>TreeNode</span><span><span>&gt;</span><span> </span></span><span>generateTrees</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span><span> n </span><span>==</span><span> </span></span><span>0</span><span> </span><span>?</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>TreeNode</span><span>&gt;() </span><span>:</span><span> </span><span>generate</span><span>(</span><span>1</span><span>, n);</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>TreeNode</span><span><span>&gt;</span><span> </span></span><span>generate</span><span>(</span><span>int</span><span><span> </span><span>start</span><span>, </span></span><span>int</span><span><span> </span><span>end</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>TreeNode</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>TreeNode</span><span>&gt;();</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (start </span><span>&gt;=</span><span> end) {</span></span></div></div><div><div><div>25</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span><span>(start </span><span>&gt;</span><span> end </span></span><span>?</span><span> </span><span>null</span><span> </span><span>:</span><span> </span><span>new</span><span> </span><span>TreeNode</span><span>(start));</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>TreeNode</span><span><span>&gt; </span><span>leftTreeList</span><span>, </span><span>rightTreeList</span></span><span>;</span></div></div><div><div><div>30</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> start; i </span><span>&lt;=</span><span> end; i++) {</span></span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>            </span><span>// divide and conquer, generate left and right subtrees based on indices</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>leftTreeList </span><span>=</span><span> </span><span>generate</span><span><span>(start, i </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>rightTreeList </span><span>=</span><span> </span><span>generate</span><span><span>(i </span><span>+</span><span> </span></span><span>1</span><span>, end);</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>            </span><span>for</span><span> (</span><span>TreeNode</span><span><span> </span><span>leftTree</span><span> </span></span><span>:</span><span> leftTreeList) {</span></div></div><div><div><div>37</div></div><div><span>                </span><span>for</span><span> (</span><span>TreeNode</span><span><span> </span><span>rightTree</span></span><span>:</span><span> rightTreeList) {</span></div></div><div><div><div>38</div></div><div><span>                    </span><span>TreeNode</span><span><span> </span><span>root</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeNode</span><span>(i);</span></div></div><div><div><div>39</div></div><div><span>                    </span><span>root</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> leftTree;</span></span></div></div><div><div><div>40</div></div><div><span>                    </span><span>root</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> rightTree;</span></span></div></div><div><div><div>41</div></div><div><span>                    </span><span>result</span><span>.</span><span>add</span><span>(root);</span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>47</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>96. Unique Binary Search Trees<a href="#96-unique-binary-search-trees"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/unique-binary-search-trees/" target="_blank">https://leetcode.com/problems/unique-binary-search-trees/</a></p><hr /><p>使用动态规划。假如<code>dp[n]</code>表示输入为<code>n</code>时不同BST的数量，<code>F(i, n)</code>表示以数字i为根节点的不同BST的数量（<code>1 &lt;= i &lt;= n</code>)，显然有：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>dp(n) = F(1, n) + F(2, n) + ... + F(n, n).</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>对于特殊情况，例如<code>n == 0</code>（空树）或<code>n == 1</code>（只有一个根节点），则<code>dp[0] = 1</code>，<code>dp[1] = 1</code></p><p>基于BST的性质，当以数字<code>i</code>为节点时，左子树的节点值一定为<code>[1, 2, ..., i-1]</code>，右子树的节点值则为<code>[i+1, i+2, ..., n]</code>。因此，求<code>F(i, n)</code>的过程实际上是求左右子树不同BST的数量，即：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>F(i, n) = dp(i-1) * dp(n-i), where 1 &lt;= i &lt;= n</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>合并以上两式得到：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>dp(n) = dp(0) * dp(n-1) + dp(1) * dp(n-2) + … + dp(n-1) * dp(0)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>由此使用动态规划进行递推即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>numTrees</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[n</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>dp[</span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>2</span><span><span>; i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>8</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> i; j++) {</span></span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>dp[i] </span><span>+=</span><span> dp[j] </span><span>*</span><span> dp[i </span><span>-</span><span> </span><span>1</span><span><span> </span><span>-</span><span> j];</span></span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span> dp[n];</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>97. Interleaving String<a href="#97-interleaving-string"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/interleaving-string/" target="_blank">https://leetcode.com/problems/interleaving-string/</a></p><hr /><p>使用二维动态规划。假设<code>s1</code>正位于第<code>i</code>位，<code>s2</code>正位于第<code>j</code>位，则<code>dp[i][j]</code>表示<code>s3</code>的第<code>i+j-1</code>位是否为插入点。第0位视为空字符串。考虑四种情况：</p><ul>
<li><code>i</code>, <code>j</code>均为0，即<code>s1</code>, <code>s2</code>均为空字符串，则<code>s3</code>也为空字符串，视为一个插入点</li>
<li>只有<code>i</code>为0时，<code>s2</code>第<code>j-1</code>位需要和<code>s3</code>第<code>i+j-1</code>位相等，且<code>s2</code>的前一位需要为插入点，满足这两个条件才是一个新插入点。</li>
<li>只有<code>j</code>为<code>0</code>时，<code>s1</code>第<code>i-1</code>位需要和<code>s3</code>第<code>i+j-1</code>位相等，且<code>s1</code>的前一位需要为插入点，满足这两个条件才是一个新插入点。</li>
<li><code>i</code>，<code>j</code>都不为0，上述两种的两种情况任一满足即为新插入点。</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isInterleave</span><span>(</span><span>String</span><span><span> </span><span>s1</span><span>, </span></span><span>String</span><span><span> </span><span>s2</span><span>, </span></span><span>String</span><span><span> </span><span>s3</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>s3</span><span>.</span><span>length</span><span><span>() </span><span>!=</span><span> </span></span><span>s1</span><span>.</span><span>length</span><span><span>() </span><span>+</span><span> </span></span><span>s2</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>len1</span><span> </span></span><span><span>=</span><span> </span></span><span>s1</span><span>.</span><span>length</span><span><span>(), len2 </span><span>=</span><span> </span></span><span>s2</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>boolean</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span><span>[len1 </span><span>+</span><span> </span></span><span>1</span><span><span>][len2 </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;=</span><span> len1; i++) {</span></span></div></div><div><div><div>11</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;=</span><span> len2; j++) {</span></span></div></div><div><div><div>12</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> j </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>dp[i][j] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (i </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>15</div></div><div><span><span>                    </span></span><span>dp[i][j] </span><span>=</span><span> (dp[i][j</span><span>-</span><span>1</span><span><span>] </span><span>&amp;&amp;</span><span> </span></span><span>s2</span><span>.</span><span>charAt</span><span><span>(j</span><span>-</span></span><span>1</span><span><span>) </span><span>==</span><span> </span></span><span>s3</span><span>.</span><span>charAt</span><span><span>(i</span><span>+</span><span>j</span><span>-</span></span><span>1</span><span>));</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (j </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>17</div></div><div><span><span>                    </span></span><span>dp[i][j] </span><span>=</span><span> (dp[i</span><span>-</span><span>1</span><span><span>][j] </span><span>&amp;&amp;</span><span> </span></span><span>s1</span><span>.</span><span>charAt</span><span><span>(i</span><span>-</span></span><span>1</span><span><span>) </span><span>==</span><span> </span></span><span>s3</span><span>.</span><span>charAt</span><span><span>(i</span><span>+</span><span>j</span><span>-</span></span><span>1</span><span>));</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>19</div></div><div><span><span>                    </span></span><span>dp[i][j] </span><span>=</span><span> ((dp[i</span><span>-</span><span>1</span><span><span>][j] </span><span>&amp;&amp;</span><span> </span></span><span>s1</span><span>.</span><span>charAt</span><span><span>(i</span><span>-</span></span><span>1</span><span><span>) </span><span>==</span><span> </span></span><span>s3</span><span>.</span><span>charAt</span><span><span>(i</span><span>+</span><span>j</span><span>-</span></span><span>1</span><span><span>)) </span><span>||</span></span></div></div><div><div><div>20</div></div><div><span><span>                                </span></span><span>(dp[i][j</span><span>-</span><span>1</span><span><span>] </span><span>&amp;&amp;</span><span> </span></span><span>s2</span><span>.</span><span>charAt</span><span><span>(j</span><span>-</span></span><span>1</span><span><span>) </span><span>==</span><span> </span></span><span>s3</span><span>.</span><span>charAt</span><span><span>(i</span><span>+</span><span>j</span><span>-</span></span><span>1</span><span>)));</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> dp[len1][len2];</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>98. Validate Binary Search Tree<a href="#98-validate-binary-search-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/validate-binary-search-tree/" target="_blank">https://leetcode.com/problems/validate-binary-search-tree/</a></p><hr /><p>递归检查每个节点，左子的值必须比当前节点小，右子的值必须比当前节点大。注意当前节点如果为空节点也算作BST。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isValidBST</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> </span><span>isValid</span><span>(root, </span><span>Long</span><span>.</span><span>MIN_VALUE</span><span>, </span><span>Long</span><span>.</span><span>MAX_VALUE</span><span>);</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isValid</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>, </span></span><span>long</span><span><span> </span><span>minVal</span><span>, </span></span><span>long</span><span><span> </span><span>maxVal</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span> (</span><span>node</span><span>.</span><span>val</span><span><span> </span><span>&gt;=</span><span> maxVal </span><span>||</span><span> </span></span><span>node</span><span>.</span><span>val</span><span><span> </span><span>&lt;=</span><span> minVal) {</span></span></div></div><div><div><div>27</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// left and right child should be valid</span></div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span> </span><span>isValid</span><span>(</span><span>node</span><span>.</span><span>left</span><span>, minVal, </span><span>node</span><span>.</span><span>val</span><span><span>) </span><span>&amp;&amp;</span><span> </span></span><span>isValid</span><span>(</span><span>node</span><span>.</span><span>right</span><span>, </span><span>node</span><span>.</span><span>val</span><span>, maxVal);</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>99. Recover Binary Search Tree<a href="#99-recover-binary-search-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/recover-binary-search-tree/" target="_blank">https://leetcode.com/problems/recover-binary-search-tree/</a></p><hr /><p>使用Morris遍历算法，时间复杂度为<code>O(n)</code>, 空间复杂度为<code>O(1)</code>。</p><p>这个遍历方法的精髓在于对任意一个节点，找到其左子树中的最大值，然后把这个最大值和当前节点连在一起，这样就能形成一条近似从小到大排序的链，之后用双指针直接在链上找到两个乱序节点即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>recoverTree</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>// two treenodes to be swapped</span></div></div><div><div><div>19</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>first</span><span> </span></span><span><span>=</span><span> </span></span><span>null</span><span><span>, second </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>pre</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeNode</span><span>(</span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>);</span></div></div><div><div><div>22</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> root;</span></span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>while</span><span><span> (cur </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>TreeNode</span><span><span> </span><span>node</span><span> </span></span><span><span>=</span><span> </span></span><span>cur</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>            </span><span>if</span><span><span> (node </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>28</div></div><div><span>                </span><span>// find the rightmost node of the left subtree</span></div></div><div><div><div>29</div></div><div><span>                </span><span>while</span><span> (</span><span>node</span><span>.</span><span>right</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>node</span><span>.</span><span>right</span><span><span> </span><span>!=</span><span> cur) {</span></span></div></div><div><div><div>30</div></div><div><span><span>                    </span></span><span>node </span><span>=</span><span> </span><span>node</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>                </span><span>// if unvisited, link it to current node and continue visit current left subtree</span></div></div><div><div><div>34</div></div><div><span>                </span><span>if</span><span> (</span><span>node</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>35</div></div><div><span>                    </span><span>node</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> cur;</span></span></div></div><div><div><div>36</div></div><div><span><span>                    </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>37</div></div><div><span>                    </span><span>continue</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>39</div></div><div><span>                    </span><span>// else unlink</span></div></div><div><div><div>40</div></div><div><span>                    </span><span>node</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>            </span><span>// compare current node with former node, find two unordered nodes</span></div></div><div><div><div>45</div></div><div><span>            </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>val</span><span><span> </span><span>&lt;</span><span> </span></span><span>pre</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>46</div></div><div><span>                </span><span>if</span><span><span> (first </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>47</div></div><div><span><span>                    </span></span><span>first </span><span>=</span><span> pre;</span></div></div><div><div><div>48</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span><span>                </span></span><span>second </span><span>=</span><span> cur;</span></div></div><div><div><div>50</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>            </span><span>// move forward two pointers</span></div></div><div><div><div>53</div></div><div><span><span>            </span></span><span>pre </span><span>=</span><span> cur;</span></div></div><div><div><div>54</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>55</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>56</div></div><div>
</div></div><div><div><div>57</div></div><div><span>        </span><span>// swap value</span></div></div><div><div><div>58</div></div><div><span>        </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> </span></span><span>second</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>59</div></div><div><span>        </span><span>second</span><span>.</span><span>val</span><span><span> </span><span>=</span><span> </span></span><span>first</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>60</div></div><div><span>        </span><span>first</span><span>.</span><span>val</span><span><span> </span><span>=</span><span> temp;</span></span></div></div><div><div><div>61</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>62</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>100. Same Tree<a href="#100-same-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/same-tree/" target="_blank">https://leetcode.com/problems/same-tree/</a></p><hr /><p>如果两个节点一个为空，一个不空，或是两个节点的值不一样，则两个树不相同。此外，两个节点的左子和右子也应分别相同。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isSameTree</span><span>(</span><span>TreeNode</span><span><span> </span><span>p</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>q</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (p </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> q </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span><span> ((p </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> q </span><span>!=</span><span> </span></span><span>null</span><span><span>) </span><span>||</span><span> (p </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> q </span><span>==</span><span> </span></span><span>null</span><span><span>) </span><span>||</span><span> </span></span><span>p</span><span>.</span><span>val</span><span><span> </span><span>!=</span><span> </span></span><span>q</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> </span><span>isSameTree</span><span>(</span><span>p</span><span>.</span><span>left</span><span>, </span><span>q</span><span>.</span><span>left</span><span><span>) </span><span>&amp;&amp;</span><span> </span></span><span>isSameTree</span><span>(</span><span>p</span><span>.</span><span>right</span><span>, </span><span>q</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2020-01-01-leetcode101-200/</id>
      <title type="text">LeetCode 101-200</title>
      <published>2020-01-01T00:00:00.000Z</published>
      <updated>2020-01-01T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2020-01-01-leetcode101-200/"/>
      <summary type="text">LeetCode Problems 101-200.</summary>
      <content type="html"><![CDATA[<p>LeetCode Problems 101-200.</p>

<section><h2>101. Symmetric Tree<a href="#101-symmetric-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/symmetric-tree/" target="_blank">https://leetcode.com/problems/symmetric-tree/</a></p><hr /><p>一棵树对称有两种情况：</p><ul>
<li>当前节点为空</li>
<li>左右子树对称</li>
</ul><p>因此我们可以构造一个辅助比较函数判断左右子树是否对称。如果一边为空节点，另一边也必须为空节点；另外对称节点的值应当相等，并且左子的儿子还要和右子的儿子对称相等（无论是否为空节点）。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isSymmetric</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span><span> root </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>helper</span><span>(</span><span>root</span><span>.</span><span>left</span><span>, </span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>helper</span><span>(</span><span>TreeNode</span><span><span> </span><span>left</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>right</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>// if one side is null, the other side must be null either</span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span><span> (left </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> right </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>return</span><span><span> left </span><span>==</span><span> right;</span></span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>// nodes at two sides should have same value</span></div></div><div><div><div>28</div></div><div><span>        </span><span>if</span><span> (</span><span>left</span><span>.</span><span>val</span><span><span> </span><span>!=</span><span> </span></span><span>right</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>// children's children should be same</span></div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span> </span><span>helper</span><span>(</span><span>left</span><span>.</span><span>left</span><span>, </span><span>right</span><span>.</span><span>right</span><span><span>) </span><span>&amp;&amp;</span><span> </span></span><span>helper</span><span>(</span><span>left</span><span>.</span><span>right</span><span>, </span><span>right</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>102. Binary Tree Level Order Traversal<a href="#102-binary-tree-level-order-traversal"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-level-order-traversal/" target="_blank">https://leetcode.com/problems/binary-tree-level-order-traversal/</a></p><hr /><p>第一种方法，使用DFS，遍历至当前节点时，直接将其添加到这个节点所在的层数数组中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>levelOrder</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>helper</span><span>(root, result, </span><span>0</span><span>);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>helper</span><span>(</span><span>TreeNode</span><span><span> </span><span>curNode</span><span>, </span></span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>int</span><span><span> </span><span>level</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (curNode </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>// add new level</span></div></div><div><div><div>29</div></div><div><span>        </span><span>if</span><span> (</span><span>result</span><span>.</span><span>size</span><span><span>() </span><span>&lt;=</span><span> level) {</span></span></div></div><div><div><div>30</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>LinkedList</span><span>&lt;</span><span>Integer</span><span>&gt;());</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>result</span><span>.</span><span>get</span><span>(level).</span><span>add</span><span>(</span><span>curNode</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>34</div></div><div><span>        </span><span>helper</span><span>(</span><span>curNode</span><span>.</span><span>left</span><span><span>, result, level </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>35</div></div><div><span>        </span><span>helper</span><span>(</span><span>curNode</span><span>.</span><span>right</span><span><span>, result, level </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>第二种方法，使用队列进行层次遍历。每一层循环时，队列中的元素都是当前层的元素。遍历队列中每个元素，只要其左子右子不空，就加入队列，再将当前队首元素弹出。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>levelOrder</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>20</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>Queue</span><span>&lt;</span><span>TreeNode</span><span><span>&gt; </span><span>q</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayDeque</span><span>&lt;&gt;();</span></div></div><div><div><div>24</div></div><div><span>        </span><span>q</span><span>.</span><span>offer</span><span>(root);</span></div></div><div><div><div>25</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>q</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>int</span><span><span> </span><span>size</span><span> </span></span><span><span>=</span><span> </span></span><span>q</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>27</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>tempList</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>28</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> size; i++) {</span></span></div></div><div><div><div>29</div></div><div><span>                </span><span>if</span><span> (</span><span>q</span><span>.</span><span>peek</span><span>().</span><span>left</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>30</div></div><div><span>                    </span><span>q</span><span>.</span><span>offer</span><span>(</span><span>q</span><span>.</span><span>peek</span><span>().</span><span>left</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>                </span><span>if</span><span> (</span><span>q</span><span>.</span><span>peek</span><span>().</span><span>right</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>33</div></div><div><span>                    </span><span>q</span><span>.</span><span>offer</span><span>(</span><span>q</span><span>.</span><span>peek</span><span>().</span><span>right</span><span>);</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>                </span><span>tempList</span><span>.</span><span>add</span><span>(</span><span>q</span><span>.</span><span>poll</span><span>().</span><span>val</span><span>);</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(tempList);</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>103. Binary Tree Zigzag Level Order Traversal<a href="#103-binary-tree-zigzag-level-order-traversal"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/" target="_blank">https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/</a></p><hr /><p>在上一题的DFS基础上略加修改，根据当前层数的奇偶性，决定按顺序添加还是倒序添加即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>zigzagLevelOrder</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>helper</span><span>(root, result, </span><span>0</span><span>);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>helper</span><span>(</span><span>TreeNode</span><span><span> </span><span>curNode</span><span>, </span></span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>int</span><span><span> </span><span>level</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (curNode </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>// add new level</span></div></div><div><div><div>29</div></div><div><span>        </span><span>if</span><span> (</span><span>result</span><span>.</span><span>size</span><span><span>() </span><span>&lt;=</span><span> level) {</span></span></div></div><div><div><div>30</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>LinkedList</span><span>&lt;</span><span>Integer</span><span>&gt;());</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>// decide insert position by odd / even level</span></div></div><div><div><div>34</div></div><div><span>        </span><span>if</span><span><span> (level </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>35</div></div><div><span>            </span><span>result</span><span>.</span><span>get</span><span>(level).</span><span>add</span><span>(</span><span>curNode</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>37</div></div><div><span>            </span><span>result</span><span>.</span><span>get</span><span>(level).</span><span>add</span><span>(</span><span>0</span><span>, </span><span>curNode</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>helper</span><span>(</span><span>curNode</span><span>.</span><span>left</span><span><span>, result, level </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>41</div></div><div><span>        </span><span>helper</span><span>(</span><span>curNode</span><span>.</span><span>right</span><span><span>, result, level </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>104. Maximum Depth of Binary Tree<a href="#104-maximum-depth-of-binary-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/maximum-depth-of-binary-tree/" target="_blank">https://leetcode.com/problems/maximum-depth-of-binary-tree/</a></p><hr /><p>使用DFS，分别比较左子树和右子树的深度，取最大值+1（加上自身的深度），累积至根节点得到结果。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxDepth</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> </span><span>height</span><span>(root);</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>height</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>// height of left subtree and right subtree</span></div></div><div><div><div>27</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>height</span><span>(</span><span>node</span><span>.</span><span>left</span><span><span>), right </span><span>=</span><span> </span></span><span>height</span><span>(</span><span>node</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(left, right) </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>105. Construct Binary Tree from Preorder and Inorder Traversal<a href="#105-construct-binary-tree-from-preorder-and-inorder-traversal"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/" target="_blank">https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/</a></p><hr /><p>在只有前序遍历的情况下，我们只能模糊地知道我们会先遍历到根节点，但之后遍历左右子树时，我们不知道什么时候结束遍历左子树，开始遍历右子树。所以我们需要中序遍历进行辅助，因为中序遍历会先于遍历根节点之前遍历完左子树。我们只需要拿<code>preorder</code>遇到的根节点到<code>inorder</code>中搜索，就能知道左、右子树分别是哪些元素。</p><p>使用一个变量<code>rootIdx</code>跟踪前序遍历数组，在<code>inorder</code>中到当前根节点<code>preorder[rootIdx]</code>。<code>inorder</code>左侧的点全部在根节点左子树上，右侧的点都在根节点右子树上。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> rootIdx </span><span><span>=</span><span> </span></span><span>0</span><span><span>;</span><span> </span></span><span>// index of current root node in preorder</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>buildTree</span><span>(</span><span>int</span><span><span>[] </span><span>preorder</span><span>, </span></span><span>int</span><span><span>[] </span><span>inorder</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span> (</span><span>preorder</span><span>.</span><span>length</span><span><span> </span><span>!=</span><span> </span></span><span>inorder</span><span>.</span><span>length</span><span><span> </span><span>||</span><span> </span></span><span>inorder</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> </span><span>builder</span><span>(preorder, inorder, </span><span>0</span><span>, </span><span>inorder</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>    </span><span>private</span><span> </span><span>TreeNode</span><span> </span><span>builder</span><span>(</span><span>int</span><span><span>[] </span><span>preorder</span><span>, </span></span><span>int</span><span><span>[] </span><span>inorder</span><span>, </span></span><span>int</span><span><span> </span><span>start</span><span>, </span></span><span>int</span><span><span> </span><span>end</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>28</div></div><div><span>        </span><span>if</span><span><span> (start </span><span>&gt;</span><span> end) {</span></span></div></div><div><div><div>29</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>node</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeNode</span><span>(preorder[rootIdx]);</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>rootIdx++;</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>if</span><span><span> (start </span><span>==</span><span> end) {</span></span></div></div><div><div><div>36</div></div><div><span>            </span><span>return</span><span> node;</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>// find current element in inorder array</span></div></div><div><div><div>40</div></div><div><span>        </span><span>// this element will be the split point</span></div></div><div><div><div>41</div></div><div><span>        </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>42</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> end; i </span><span>&gt;=</span><span> start; i--) {</span></span></div></div><div><div><div>43</div></div><div><span>            </span><span>if</span><span><span> (inorder[i] </span><span>==</span><span> </span></span><span>node</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>44</div></div><div><span><span>                </span></span><span>index </span><span>=</span><span> i;</span></div></div><div><div><div>45</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>46</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>        </span><span>node</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>builder</span><span><span>(preorder, inorder, start, index </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>50</div></div><div><span>        </span><span>node</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>builder</span><span><span>(preorder, inorder, index </span><span>+</span><span> </span></span><span>1</span><span>, end);</span></div></div><div><div><div>51</div></div><div><span>        </span><span>return</span><span> node;</span></div></div><div><div><div>52</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>106. Construct Binary Tree from Inorder and Postorder Traversal<a href="#106-construct-binary-tree-from-inorder-and-postorder-traversal"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/" target="_blank">https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/</a></p><hr /><p>与上一题思路类似，需要注意的是先构造右子树，再构造左子树。这是因为后序遍历先遍历右子树再遍历左子树，和前序遍历相反。另外根据对称性，从<code>postorder</code>中提取根节点时也应该从后往前遍历。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> rootIdx </span><span><span>=</span><span> </span></span><span>0</span><span><span>;</span><span>  </span></span><span>// index of current root node in postorder</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>buildTree</span><span>(</span><span>int</span><span><span>[] </span><span>inorder</span><span>, </span></span><span>int</span><span><span>[] </span><span>postorder</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span> (</span><span>inorder</span><span>.</span><span>length</span><span><span> </span><span>!=</span><span> </span></span><span>postorder</span><span>.</span><span>length</span><span><span> </span><span>||</span><span> </span></span><span>inorder</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// initialization, searched from the end of postorder</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>rootIdx </span><span>=</span><span> </span><span>postorder</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> </span><span>builder</span><span>(postorder, inorder, </span><span>0</span><span>, </span><span>postorder</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>    </span><span>private</span><span> </span><span>TreeNode</span><span> </span><span>builder</span><span>(</span><span>int</span><span><span>[] </span><span>postorder</span><span>, </span></span><span>int</span><span><span>[] </span><span>inorder</span><span>, </span></span><span>int</span><span><span> </span><span>start</span><span>, </span></span><span>int</span><span><span> </span><span>end</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>if</span><span><span> (start </span><span>&gt;</span><span> end) {</span></span></div></div><div><div><div>32</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>node</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeNode</span><span>(postorder[rootIdx]);</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>rootIdx--;</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>if</span><span><span> (start </span><span>==</span><span> end) {</span></span></div></div><div><div><div>39</div></div><div><span>            </span><span>return</span><span> node;</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>// find current element in inorder array</span></div></div><div><div><div>43</div></div><div><span>        </span><span>// this element will be the split point</span></div></div><div><div><div>44</div></div><div><span>        </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>45</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> end; i </span><span>&gt;=</span><span> start; i--) {</span></span></div></div><div><div><div>46</div></div><div><span>            </span><span>if</span><span><span> (inorder[i] </span><span>==</span><span> </span></span><span>node</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>47</div></div><div><span><span>                </span></span><span>index </span><span>=</span><span> i;</span></div></div><div><div><div>48</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>        </span><span>node</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>builder</span><span><span>(postorder, inorder, index </span><span>+</span><span> </span></span><span>1</span><span>, end);</span></div></div><div><div><div>53</div></div><div><span>        </span><span>node</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>builder</span><span><span>(postorder, inorder, start, index </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>54</div></div><div><span>        </span><span>return</span><span> node;</span></div></div><div><div><div>55</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>56</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>107. Binary Tree Level Order Traversal II<a href="#107-binary-tree-level-order-traversal-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-level-order-traversal-ii/" target="_blank">https://leetcode.com/problems/binary-tree-level-order-traversal-ii/</a></p><hr /><p>仍然使用DFS，但补齐至当前层数时，需要倒序添加层数（第一层为最后，第二层为倒数第二，…），获取层数的结果时应以总数和当前层数之差作为索引。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>levelOrderBottom</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>helper</span><span>(root, result, </span><span>0</span><span>);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>helper</span><span>(</span><span>TreeNode</span><span><span> </span><span>curNode</span><span>, </span></span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>int</span><span><span> </span><span>level</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (curNode </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>// add new level</span></div></div><div><div><div>29</div></div><div><span>        </span><span>if</span><span> (</span><span>result</span><span>.</span><span>size</span><span><span>() </span><span>&lt;=</span><span> level) {</span></span></div></div><div><div><div>30</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>0</span><span>, </span><span>new</span><span> </span><span>LinkedList</span><span>&lt;</span><span>Integer</span><span>&gt;());</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>result</span><span>.</span><span>get</span><span>(</span><span>result</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>-</span><span> level).</span></span><span>add</span><span>(</span><span>curNode</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>34</div></div><div><span>        </span><span>helper</span><span>(</span><span>curNode</span><span>.</span><span>left</span><span><span>, result, level </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>35</div></div><div><span>        </span><span>helper</span><span>(</span><span>curNode</span><span>.</span><span>right</span><span><span>, result, level </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>108. Convert Sorted Array to Binary Search Tree<a href="#108-convert-sorted-array-to-binary-search-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/" target="_blank">https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/</a></p><hr /><p>结合二分查找思想，总是将当前中位数作为根节点，比其小的数位于左子树，比其大的数位于右子树。当子数组区间下标重叠，返回空节点。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>sortedArrayToBST</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span>(nums, </span><span>0</span><span>, </span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>    </span><span>private</span><span> </span><span>TreeNode</span><span> </span><span>helper</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>low</span><span>, </span></span><span>int</span><span><span> </span><span>high</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span><span> (low </span><span>&gt;</span><span> high) {</span></span></div></div><div><div><div>27</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// find median of the array, set as root node</span></div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> low </span><span>+</span><span> (high </span><span>-</span><span> low) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>32</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>node</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeNode</span><span>(nums[mid]);</span></div></div><div><div><div>33</div></div><div><span>        </span><span>node</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>helper</span><span><span>(nums, low, mid </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>34</div></div><div><span>        </span><span>node</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>helper</span><span><span>(nums, mid </span><span>+</span><span> </span></span><span>1</span><span>, high);</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>return</span><span> node;</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>109. Convert Sorted List to Binary Search Tree<a href="#109-convert-sorted-list-to-binary-search-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/" target="_blank">https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/</a></p><hr /><p>使用快慢指针获取到子链表的中间节点，其余仍然使用二分法。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>/**</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>16</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>17</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>18</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>19</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>20</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>21</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>22</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>23</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>24</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>25</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>26</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>27</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>sortedListToBST</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>28</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span> </span><span>helper</span><span>(head, </span><span>null</span><span>);</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>    </span><span>private</span><span> </span><span>TreeNode</span><span> </span><span>helper</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>, </span></span><span>ListNode</span><span><span> </span><span>tail</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>35</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> tail) {</span></span></div></div><div><div><div>36</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>// find the median node, set it as root</span></div></div><div><div><div>40</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>slow</span><span> </span></span><span><span>=</span><span> head, fast </span><span>=</span><span> head;</span></span></div></div><div><div><div>41</div></div><div><span>        </span><span>while</span><span><span> (fast </span><span>!=</span><span> tail </span><span>&amp;&amp;</span><span> </span></span><span>fast</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> tail) {</span></span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>slow </span><span>=</span><span> </span><span>slow</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>fast </span><span>=</span><span> </span><span>fast</span><span>.</span><span>next</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeNode</span><span>(</span><span>slow</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>47</div></div><div><span>        </span><span>mid</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>helper</span><span>(head, slow);</span></div></div><div><div><div>48</div></div><div><span>        </span><span>mid</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>helper</span><span>(</span><span>slow</span><span>.</span><span>next</span><span>, tail);</span></div></div><div><div><div>49</div></div><div><span>        </span><span>return</span><span> mid;</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>110. Balanced Binary Tree<a href="#110-balanced-binary-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/balanced-binary-tree/" target="_blank">https://leetcode.com/problems/balanced-binary-tree/</a></p><hr /><p>此题实际是一个计算树高度的过程，如果树的高度不是-1（不平衡的情况），说明树是平衡的。讨论特殊情况如下：</p><ul>
<li>遇到空节点，返回0</li>
<li>左子树或右子树的高度为-1，说明子树已经不平衡，那么以当前节点为根的树高度也为-1</li>
<li>左、右子树高度差值大于1，则当前节点高度为-1</li>
</ul><p>最后取左、右子树的高度最大值，并+1（节点自身），得到以当前节点为根的树的高度。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isBalanced</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> </span><span>helper</span><span><span>(root) </span><span>!=</span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>helper</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>int</span><span><span> </span><span>leftHeight</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span>(</span><span>node</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>27</div></div><div><span>        </span><span>if</span><span><span> (leftHeight </span><span>==</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>28</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>rightHeight</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span>(</span><span>node</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>32</div></div><div><span>        </span><span>if</span><span><span> (rightHeight </span><span>==</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>33</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>if</span><span> (</span><span>Math</span><span>.</span><span>abs</span><span><span>(leftHeight </span><span>-</span><span> rightHeight) </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>37</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>return</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(leftHeight, rightHeight) </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>111. Minimum Depth of Binary Tree<a href="#111-minimum-depth-of-binary-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minimum-depth-of-binary-tree/" target="_blank">https://leetcode.com/problems/minimum-depth-of-binary-tree/</a></p><hr /><p>第一种方法，使用递归，与寻找最大深度的解法类似。注意当某一子树为空时，树的高度实际上就是另一个子树的高度。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minDepth</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>int</span><span><span> </span><span>leftHeight</span><span> </span></span><span><span>=</span><span> </span></span><span>minDepth</span><span>(</span><span>root</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>23</div></div><div><span>        </span><span>int</span><span><span> </span><span>rightHeight</span><span> </span></span><span><span>=</span><span> </span></span><span>minDepth</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span><span> leftHeight </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> rightHeight </span><span>==</span><span> </span></span><span>0</span><span> </span><span>?</span><span><span> leftHeight </span><span>+</span><span> rightHeight </span><span>+</span><span> </span></span><span>1</span></div></div><div><div><div>25</div></div><div><span>                                                   </span><span>:</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(leftHeight, rightHeight) </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>第二种方法，借用树的层次遍历思想，检查是否有某个节点不存在儿子。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minDepth</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>Queue</span><span>&lt;</span><span>TreeNode</span><span><span>&gt; </span><span>q</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayDeque</span><span>&lt;&gt;();</span></div></div><div><div><div>23</div></div><div><span>        </span><span>q</span><span>.</span><span>offer</span><span>(root);</span></div></div><div><div><div>24</div></div><div><span>        </span><span>int</span><span><span> </span><span>depth</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>q</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>int</span><span><span> </span><span>size</span><span> </span></span><span><span>=</span><span> </span></span><span>q</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>depth++;</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> size; i++) {</span></span></div></div><div><div><div>31</div></div><div><span>                </span><span>TreeNode</span><span><span> </span><span>node</span><span> </span></span><span><span>=</span><span> </span></span><span>q</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>                </span><span>// no children, so one subtree will end here</span></div></div><div><div><div>34</div></div><div><span>                </span><span>if</span><span> (</span><span>node</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>node</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>35</div></div><div><span>                    </span><span>return</span><span> depth;</span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>                </span><span>if</span><span> (</span><span>node</span><span>.</span><span>left</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>39</div></div><div><span>                    </span><span>q</span><span>.</span><span>offer</span><span>(</span><span>node</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>40</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>                </span><span>if</span><span> (</span><span>node</span><span>.</span><span>right</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>42</div></div><div><span>                    </span><span>q</span><span>.</span><span>offer</span><span>(</span><span>node</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>43</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>        </span><span>return</span><span> depth;</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>112. Path Sum<a href="#112-path-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/path-sum/" target="_blank">https://leetcode.com/problems/path-sum/</a></p><hr /><p>每向下一层递归时就更新<code>targetSum</code>的值，遇到叶子节点的值与当前<code>sum</code>相同则返回true。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>hasPathSum</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>, </span></span><span>int</span><span><span> </span><span>targetSum</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>root</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>root</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> targetSum) {</span></span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> </span><span>hasPathSum</span><span>(</span><span>root</span><span>.</span><span>left</span><span><span>, targetSum </span><span>-</span><span> </span></span><span>root</span><span>.</span><span>val</span><span><span>) </span><span>||</span><span> </span></span><span>hasPathSum</span><span>(</span><span>root</span><span>.</span><span>right</span><span><span>, targetSum </span><span>-</span><span> </span></span><span>root</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>113. Path Sum II<a href="#113-path-sum-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/path-sum-ii/" target="_blank">https://leetcode.com/problems/path-sum-ii/</a></p><hr /><p>回溯算法，无论当前递归内是否找到一条path，都需要在完成遍历后从临时数组中弹出最后一个数，这样才能尝试其他path。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>pathSum</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>, </span></span><span>int</span><span><span> </span><span>sum</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>helper</span><span>(result, </span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;(), root, sum);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>helper</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>temp</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>node</span><span>, </span></span><span>int</span><span><span> </span><span>sum</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>temp</span><span>.</span><span>add</span><span>(</span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>if</span><span> (</span><span>node</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>node</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>node</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> sum) {</span></span></div></div><div><div><div>32</div></div><div><span>            </span><span>// find a path, remove the last node and return</span></div></div><div><div><div>33</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;(temp));</span></div></div><div><div><div>34</div></div><div><span>            </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>35</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>37</div></div><div><span>            </span><span>// else continue traveling down</span></div></div><div><div><div>38</div></div><div><span>            </span><span>helper</span><span>(result, temp, </span><span>node</span><span>.</span><span>left</span><span><span>, sum </span><span>-</span><span> </span></span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>39</div></div><div><span>            </span><span>helper</span><span>(result, temp, </span><span>node</span><span>.</span><span>right</span><span><span>, sum </span><span>-</span><span> </span></span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>// no path found, remove the last node</span></div></div><div><div><div>43</div></div><div><span>        </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>44</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>114. Flatten Binary Tree to Linked List<a href="#114-flatten-binary-tree-to-linked-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/flatten-binary-tree-to-linked-list/" target="_blank">https://leetcode.com/problems/flatten-binary-tree-to-linked-list/</a></p><hr /><p>解题思路如下：</p><ol>
<li>寻找到当前节点右子树中最右的节点，如果为空则寻找其兄弟左节点</li>
<li>更新当前节点的右子为<code>prev</code>，这样能之前flatten的子树接到当前节点上；左子为空</li>
<li><code>prev</code>更新为当前节点，因为当前节点是最后一个被flatten的根节点</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>TreeNode</span><span> prev </span><span><span>=</span><span> </span></span><span>null</span><span><span>;</span><span> </span></span><span>// previous flattened node</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>flatten</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>flatten</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>25</div></div><div><span>        </span><span>flatten</span><span>(</span><span>root</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>root</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> prev;</span></span></div></div><div><div><div>28</div></div><div><span>        </span><span>root</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>prev </span><span>=</span><span> root;</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>115. Distinct Subsequences<a href="#115-distinct-subsequences"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/distinct-subsequences/" target="_blank">https://leetcode.com/problems/distinct-subsequences/</a></p><hr /><p>使用动态规划，<code>dp[i][j]</code>表示<code>s</code>的前<code>j</code>个字符中，包含<code>t</code>的前<code>i</code>个字符的次数。考虑两种情况：</p><ul>
<li><code>s</code>的第<code>j</code>个字符与<code>t</code>的第<code>i</code>个字符不同，则<code>dp[i+1][j+1]</code>与<code>dp[i+1][j]</code>相同，因为<code>s</code>多出的这个字母不影响次数</li>
<li><code>s</code>的第<code>j</code>个字符与<code>t</code>的第<code>i</code>个字符相同，则<code>dp[i+1][j+1]</code>不仅包括<code>dp[i+1][j]</code>，还包括<code>dp[i][j]</code>，因为要加上同时去掉了这对相同字母后，剩下的匹配次数。</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>numDistinct</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>String</span><span><span> </span><span>t</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>slen</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>(), tlen </span><span>=</span><span> </span></span><span>t</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[tlen</span><span>+</span></span><span>1</span><span><span>][slen</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// initialization, substring of s can always contain exactly 1 empty string</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> slen; j++) {</span></span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>dp[</span><span>0</span><span><span>][j] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> tlen; i++) {</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i; j </span><span>&lt;</span><span> slen; j++)  {</span></span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>dp[i</span><span>+</span><span>1</span><span><span>][j</span><span>+</span></span><span>1</span><span><span>] </span><span>=</span><span> (</span></span><span>t</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span>(j)) </span><span>?</span><span><span> dp[i</span><span>+</span></span><span>1</span><span><span>][j] </span><span>+</span><span> dp[i][j] </span></span><span>:</span><span><span> dp[i</span><span>+</span></span><span>1</span><span>][j];</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> dp[tlen][slen];</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>116. Populating Next Right Pointers in Each Node<a href="#116-populating-next-right-pointers-in-each-node"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/populating-next-right-pointers-in-each-node/" target="_blank">https://leetcode.com/problems/populating-next-right-pointers-in-each-node/</a></p><hr /><p>使用两个指针<code>level</code>和<code>cur</code>遍历整个树，其中<code>level</code>遍历逐层，<code>cur</code>遍历一层中的节点。对于每一个节点，完成两步修改：</p><ul>
<li>将<code>cur</code>的左儿子指向<code>cur</code>的右儿子</li>
<li>如果<code>cur</code>本身和另一个兄弟相连，那么<code>cur</code>的右儿子和<code>cur</code>的兄弟的左儿子就是邻居关系，二者需要连起来</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public Node left;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>public Node right;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node next;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>public Node() {}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>public Node(int _val) {</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>public Node(int _val, Node _left, Node _right, Node _next) {</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>left = _left;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>right = _right;</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>next = _next;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>};</span></div></div><div><div><div>22</div></div><div><span>*/</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>25</div></div><div><span>    </span><span>public</span><span> </span><span>Node</span><span> </span><span>connect</span><span>(</span><span>Node</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>Node</span><span><span> </span><span>level</span><span> </span></span><span><span>=</span><span> root; </span></span><span>// track each level</span></div></div><div><div><div>31</div></div><div><span>        </span><span>Node</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>null</span><span>; </span><span>// track each node in one level</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>while</span><span> (</span><span>level</span><span>.</span><span>left</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> level;</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>            </span><span>while</span><span><span> (cur </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>37</div></div><div><span>                </span><span>// left child points to right child</span></div></div><div><div><div>38</div></div><div><span>                </span><span>cur</span><span>.</span><span>left</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>cur</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>                </span><span>// if there is a right neighbor, right child points to right neighbor's left child</span></div></div><div><div><div>41</div></div><div><span>                </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>42</div></div><div><span>                    </span><span>cur</span><span>.</span><span>right</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>cur</span><span>.</span><span>next</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>43</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span>                </span><span>//</span></div></div><div><div><div>46</div></div><div><span><span>                </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>47</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>            </span><span>// move to next level</span></div></div><div><div><div>50</div></div><div><span><span>            </span></span><span>level </span><span>=</span><span> </span><span>level</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>51</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>52</div></div><div>
</div></div><div><div><div>53</div></div><div><span>        </span><span>return</span><span> root;</span></div></div><div><div><div>54</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>117. Populating Next Right Pointers in Each Node II<a href="#117-populating-next-right-pointers-in-each-node-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/" target="_blank">https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/</a></p><hr /><p>模拟层次遍历，<code>cur</code>指针指向当前层，<code>curChild</code>指向下一层。判断是否存在左子或右子，以此移动指针。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public Node left;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>public Node right;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node next;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>public Node() {}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>public Node(int _val) {</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>public Node(int _val, Node _left, Node _right, Node _next) {</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>left = _left;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>right = _right;</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>next = _next;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>};</span></div></div><div><div><div>22</div></div><div><span>*/</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>25</div></div><div><span>    </span><span>public</span><span> </span><span>Node</span><span> </span><span>connect</span><span>(</span><span>Node</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>Node</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> root;</span></span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>while</span><span><span> (cur </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>Node</span><span><span> </span><span>head</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span>(</span><span>0</span><span>); </span><span>// dummy head of next level</span></div></div><div><div><div>30</div></div><div><span>            </span><span>Node</span><span><span> </span><span>curChild</span><span> </span></span><span><span>=</span><span> head; </span></span><span>// child in the next level</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>            </span><span>while</span><span><span> (cur </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>33</div></div><div><span>                </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>left</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>34</div></div><div><span>                    </span><span>curChild</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>cur</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>                    </span></span><span>curChild </span><span>=</span><span> </span><span>curChild</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>                </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>right</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>39</div></div><div><span>                    </span><span>curChild</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>cur</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>                    </span></span><span>curChild </span><span>=</span><span> </span><span>curChild</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>                </span><span>// move to cur's sibling</span></div></div><div><div><div>44</div></div><div><span><span>                </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>            </span><span>// move to next level</span></div></div><div><div><div>48</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>head</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>49</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>        </span><span>return</span><span> root;</span></div></div><div><div><div>52</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>118. Pascal’s Triangle<a href="#118-pascals-triangle"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/pascals-triangle/" target="_blank">https://leetcode.com/problems/pascals-triangle/</a></p><hr /><p>遍历每一行的开始时，都在行首添加一个1，之后从第二个元素至倒数第二个元素，与下一个相邻元素进行累加即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>generate</span><span>(</span><span>int</span><span><span> </span><span>numRows</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (numRows </span><span>&lt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> numRows; i++) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>// add '1' at head of each row</span></div></div><div><div><div>11</div></div><div><span>            </span><span>row</span><span>.</span><span>add</span><span>(</span><span>0</span><span>, </span><span>1</span><span>);</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>row</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>; j++) {</span></div></div><div><div><div>14</div></div><div><span>                </span><span>row</span><span>.</span><span>set</span><span>(j, </span><span>row</span><span>.</span><span>get</span><span><span>(j) </span><span>+</span><span> </span></span><span>row</span><span>.</span><span>get</span><span><span>(j</span><span>+</span></span><span>1</span><span>));</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(row));</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>119. Pascal’s Triangle II<a href="#119-pascals-triangle-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/pascals-triangle-ii/" target="_blank">https://leetcode.com/problems/pascals-triangle-ii/</a></p><hr /><p>在上一题代码的基础上略作修改，只将最后一行作为结果输出即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>getRow</span><span>(</span><span>int</span><span><span> </span><span>rowIndex</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>row</span><span>.</span><span>add</span><span>(</span><span>1</span><span>);</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> rowIndex; i++) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>// add '1' at head of each row</span></div></div><div><div><div>8</div></div><div><span>            </span><span>row</span><span>.</span><span>add</span><span>(</span><span>0</span><span>, </span><span>1</span><span>);</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>row</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>; j++) {</span></div></div><div><div><div>11</div></div><div><span>                </span><span>row</span><span>.</span><span>set</span><span>(j, </span><span>row</span><span>.</span><span>get</span><span><span>(j) </span><span>+</span><span> </span></span><span>row</span><span>.</span><span>get</span><span><span>(j</span><span>+</span></span><span>1</span><span>));</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> row;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>120. Triangle<a href="#120-triangle"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/triangle/" target="_blank">https://leetcode.com/problems/triangle/</a></p><hr /><p>使用一维动态规划，自底向上迭代更新<code>dp</code>，选取相邻元素的最小值，再加上当前遍历的元素。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minimumTotal</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>triangle</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>triangle</span><span>.</span><span>size</span><span><span>() </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// bottom-up</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>triangle</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;=</span><span> i; j++) {</span></span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>dp[j] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(dp[j], dp[j</span><span>+</span></span><span>1</span><span><span>]) </span><span>+</span><span> </span></span><span>triangle</span><span>.</span><span>get</span><span>(i).</span><span>get</span><span>(j);</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span> dp[</span><span>0</span><span>];</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>121. Best Time to Buy and Sell Stock<a href="#121-best-time-to-buy-and-sell-stock"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/best-time-to-buy-and-sell-stock/" target="_blank">https://leetcode.com/problems/best-time-to-buy-and-sell-stock/</a></p><hr /><p>算出每天价格之间的差值，获利最大的时刻其实就是差值之和最大的时刻。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxProfit</span><span>(</span><span>int</span><span><span>[] </span><span>prices</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (prices </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>prices</span><span>.</span><span>length</span><span><span> </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>maxDiff</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, result </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>prices</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>// difference between today and yesterday's prices</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>maxDiff </span><span>+=</span><span> (prices[i] </span><span>-</span><span> prices[i</span><span>-</span><span>1</span><span>]);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>// find the max price difference</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>maxDiff </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(</span><span>0</span><span>, maxDiff);</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(maxDiff, result);</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>122. Best Time to Buy and Sell Stock II<a href="#122-best-time-to-buy-and-sell-stock-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/" target="_blank">https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/</a></p><hr /><p>贪心思想，只要有一天能赚钱，都用一次买卖赚走，累积利润即可得到结果。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxProfit</span><span>(</span><span>int</span><span><span>[] </span><span>prices</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (prices </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>prices</span><span>.</span><span>length</span><span><span> </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>prices</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(</span><span>0</span><span><span>, prices[i] </span><span>-</span><span> prices[i</span><span>-</span></span><span>1</span><span>]);</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>123. Best Time to Buy and Sell Stock III<a href="#123-best-time-to-buy-and-sell-stock-iii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/" target="_blank">https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/</a></p><hr /><p>使用两组变量<code>cost</code>和<code>profit</code>，分别表示两次买入的最小成本和两次卖出的最大利润。</p><p>需要注意，第二次买入的最小成本，建立在第一次卖出的最大利润之上（相当于拿已有的利润，再买入当前股票，两个数值合成为总成本）。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxProfit</span><span>(</span><span>int</span><span><span>[] </span><span>prices</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (prices </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>prices</span><span>.</span><span>length</span><span><span> </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>cost1</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span><span>, cost2 </span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>profit1</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, profit2 </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>prices</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>cost1 </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(cost1, prices[i]);</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>profit1 </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(profit1, prices[i] </span><span>-</span><span> cost1);</span></span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>            </span><span>// cost2 will be based on profit1</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>cost2 </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(cost2, prices[i] </span><span>-</span><span> profit1);</span></span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>profit2 </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(profit2, prices[i] </span><span>-</span><span> cost2);</span></span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> profit2;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>124. Binary Tree Maximum Path Sum<a href="#124-binary-tree-maximum-path-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-maximum-path-sum/" target="_blank">https://leetcode.com/problems/binary-tree-maximum-path-sum/</a></p><hr /><p>对每一个节点，计算其左子树和右子树上的最大和，返回较大一侧的值与自身节点值之和。注意，Path Sum可包括两个分支，因此对于最大值的更新，要包括当前节点和左右子节点。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> result </span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxPathSum</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>helper</span><span>(root);</span></div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>helper</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>        </span><span>int</span><span><span> </span><span>leftSum</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(</span><span>0</span><span>, </span><span>helper</span><span>(</span><span>node</span><span>.</span><span>left</span><span>));</span></div></div><div><div><div>29</div></div><div><span>        </span><span>int</span><span><span> </span><span>rightSum</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(</span><span>0</span><span>, </span><span>helper</span><span>(</span><span>node</span><span>.</span><span>right</span><span>));</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>// update current path sum</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, leftSum </span><span>+</span><span> rightSum </span><span>+</span><span> </span></span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>// max subtree sum + current node's value</span></div></div><div><div><div>35</div></div><div><span>        </span><span>return</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(leftSum, rightSum) </span><span>+</span><span> </span></span><span>node</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>125. Valid Palindrome<a href="#125-valid-palindrome"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/valid-palindrome/" target="_blank">https://leetcode.com/problems/valid-palindrome/</a></p><hr /><p>使用<code>Character</code>类的API，或者正则表达式解决。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isPalindrome</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// String modified = s.replaceAll("[^A-Za-z0-9]", "").toLowerCase();</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>head</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, tail </span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>while</span><span><span> (head </span><span>&lt;=</span><span> tail) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span> (</span><span>Character</span><span>.</span><span>isLetter</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span><span>(head)) </span><span>||</span><span> </span></span><span>Character</span><span>.</span><span>isDigit</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span>(head))) {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>if</span><span> (</span><span>Character</span><span>.</span><span>isLetter</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span><span>(tail)) </span><span>||</span><span> </span></span><span>Character</span><span>.</span><span>isDigit</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span>(tail))) {</span></div></div><div><div><div>14</div></div><div><span>                    </span><span>if</span><span> (</span><span>Character</span><span>.</span><span>toLowerCase</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span><span>(head)) </span><span>!=</span><span> </span></span><span>Character</span><span>.</span><span>toLowerCase</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span>(tail))) {</span></div></div><div><div><div>15</div></div><div><span>                        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span><span>                    </span></span><span>head++;</span></div></div><div><div><div>19</div></div><div><span><span>                    </span></span><span>tail--;</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>21</div></div><div><span><span>                    </span></span><span>tail--;</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>head++;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>126. Word Ladder II<a href="#126-word-ladder-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/word-ladder-ii/" target="_blank">https://leetcode.com/problems/word-ladder-ii/</a></p><hr /><p>先用用BFS，替换<code>begin</code>中每个单词的每一个字母，汇总得到每个单词能够转化得到的单词列表，存在map中。再使用DFS，依据单词列表的演化，将结果录入。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt;</span><span> </span></span><span>findLadders</span><span>(</span><span>String</span><span><span> </span><span>beginWord</span><span>, </span></span><span>String</span><span><span> </span><span>endWord</span><span>, </span></span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>wordList</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>dicts</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;(wordList);</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>dicts</span><span>.</span><span>contains</span><span>(endWord)) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>begin</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span><span>&lt;&gt;(), end </span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>11</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>String</span><span>, </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>12</div></div><div><span>        </span><span>begin</span><span>.</span><span>add</span><span>(beginWord);</span></div></div><div><div><div>13</div></div><div><span>        </span><span>end</span><span>.</span><span>add</span><span>(endWord);</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>bfs</span><span>(map, begin, end, dicts, </span><span>false</span><span>);</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>tempList</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>18</div></div><div><span>        </span><span>tempList</span><span>.</span><span>add</span><span>(beginWord);</span></div></div><div><div><div>19</div></div><div><span>        </span><span>dfs</span><span>(map, result, tempList, beginWord, endWord);</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>bfs</span><span>(</span><span>Map</span><span>&lt;</span><span>String</span><span>, </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>map</span><span>, </span></span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>begin</span><span>, </span></span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>end</span><span>, </span></span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>dicts</span><span>, </span></span><span>boolean</span><span><span> </span><span>reverse</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span> (</span><span>begin</span><span>.</span><span>size</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>        </span><span>dicts</span><span>.</span><span>removeAll</span><span>(begin);</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// beginning set in next search</span></div></div><div><div><div>31</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>newBegin</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>boolean</span><span><span> </span><span>finish</span><span> </span></span><span><span>=</span><span> </span></span><span>false</span><span>;</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>str</span><span> </span></span><span>:</span><span> begin) {</span></div></div><div><div><div>36</div></div><div><span>            </span><span>char</span><span><span>[] </span><span>chars</span><span> </span></span><span><span>=</span><span> </span></span><span>str</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>chars</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>39</div></div><div><span>                </span><span>// backup old alphabet</span></div></div><div><div><div>40</div></div><div><span>                </span><span>char</span><span><span> </span><span>old</span><span> </span></span><span><span>=</span><span> chars[i];</span></span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>                </span><span>// replace an alphabet with another</span></div></div><div><div><div>43</div></div><div><span>                </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>'a'</span><span><span>; c </span><span>&lt;=</span><span> </span></span><span>'z'</span><span>; c++) {</span></div></div><div><div><div>44</div></div><div><span>                    </span><span>if</span><span><span> (old </span><span>==</span><span> c) {</span></span></div></div><div><div><div>45</div></div><div><span>                        </span><span>continue</span><span>;</span></div></div><div><div><div>46</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span><span>                    </span></span><span>chars[i] </span><span>=</span><span> c;</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>                    </span><span>String</span><span><span> </span><span>candidate</span><span> </span></span><span><span>=</span><span> </span></span><span>String</span><span>.</span><span>valueOf</span><span>(chars);</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>                    </span><span>// new word must be in wordList</span></div></div><div><div><div>52</div></div><div><span>                    </span><span>if</span><span><span> (</span><span>!</span></span><span>dicts</span><span>.</span><span>contains</span><span>(candidate)) {</span></div></div><div><div><div>53</div></div><div><span>                        </span><span>continue</span><span>;</span></div></div><div><div><div>54</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>                    </span><span>// new word is in end list</span></div></div><div><div><div>57</div></div><div><span>                    </span><span>if</span><span> (</span><span>end</span><span>.</span><span>contains</span><span>(candidate)) {</span></div></div><div><div><div>58</div></div><div><span><span>                        </span></span><span>finish </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>59</div></div><div><span><span>                    </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>60</div></div><div><span>                        </span><span>newBegin</span><span>.</span><span>add</span><span>(candidate);</span></div></div><div><div><div>61</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>62</div></div><div>
</div></div><div><div><div>63</div></div><div><span>                    </span><span>// str -&gt; candidate's list</span></div></div><div><div><div>64</div></div><div><span>                    </span><span>String</span><span><span> </span><span>key</span><span> </span></span><span><span>=</span><span> reverse </span></span><span>?</span><span> candidate </span><span>:</span><span> str;</span></div></div><div><div><div>65</div></div><div><span>                    </span><span>String</span><span><span> </span><span>value</span><span> </span></span><span><span>=</span><span> reverse </span></span><span>?</span><span> str </span><span>:</span><span> candidate;</span></div></div><div><div><div>66</div></div><div><span>                    </span><span>if</span><span><span> (</span><span>!</span></span><span>map</span><span>.</span><span>containsKey</span><span>(key)) {</span></div></div><div><div><div>67</div></div><div><span>                        </span><span>map</span><span>.</span><span>put</span><span>(key, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;());</span></div></div><div><div><div>68</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>69</div></div><div><span>                    </span><span>map</span><span>.</span><span>get</span><span>(key).</span><span>add</span><span>(value);</span></div></div><div><div><div>70</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>71</div></div><div>
</div></div><div><div><div>72</div></div><div><span>                </span><span>// restore old word</span></div></div><div><div><div>73</div></div><div><span><span>                </span></span><span>chars[i] </span><span>=</span><span> old;</span></div></div><div><div><div>74</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>75</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>76</div></div><div>
</div></div><div><div><div>77</div></div><div><span>        </span><span>// optional, swap newBegin and end to speed up</span></div></div><div><div><div>78</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span><span>finish) {</span></span></div></div><div><div><div>79</div></div><div><span>            </span><span>if</span><span> (</span><span>newBegin</span><span>.</span><span>size</span><span><span>() </span><span>&gt;</span><span> </span></span><span>end</span><span>.</span><span>size</span><span>()) {</span></div></div><div><div><div>80</div></div><div><span>                </span><span>bfs</span><span><span>(map, end, newBegin, dicts, </span><span>!</span><span>reverse);</span></span></div></div><div><div><div>81</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>82</div></div><div><span>                </span><span>bfs</span><span>(map, newBegin, end, dicts, reverse);</span></div></div><div><div><div>83</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>84</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>85</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>86</div></div><div>
</div></div><div><div><div>87</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>Map</span><span>&lt;</span><span>String</span><span>, </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>map</span><span>, </span></span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>tempList</span><span>, </span></span><span>String</span><span><span> </span><span>beginWord</span><span>, </span></span><span>String</span><span><span> </span><span>endWord</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>88</div></div><div><span>        </span><span>if</span><span> (</span><span>beginWord</span><span>.</span><span>equals</span><span>(endWord)) {</span></div></div><div><div><div>89</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(tempList));</span></div></div><div><div><div>90</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>91</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>92</div></div><div>
</div></div><div><div><div>93</div></div><div><span>        </span><span>// current beginWord cannot transform to another work</span></div></div><div><div><div>94</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>map</span><span>.</span><span>containsKey</span><span>(beginWord)) {</span></div></div><div><div><div>95</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>96</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>97</div></div><div>
</div></div><div><div><div>98</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>word</span><span> </span></span><span>:</span><span> </span><span>map</span><span>.</span><span>get</span><span>(beginWord)) {</span></div></div><div><div><div>99</div></div><div><span>            </span><span>tempList</span><span>.</span><span>add</span><span>(word);</span></div></div><div><div><div>100</div></div><div><span>            </span><span>dfs</span><span>(map, result, tempList, word, endWord);</span></div></div><div><div><div>101</div></div><div><span>            </span><span>tempList</span><span>.</span><span>remove</span><span>(</span><span>tempList</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>102</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>103</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>104</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>127. Word Ladder<a href="#127-word-ladder"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/word-ladder/" target="_blank">https://leetcode.com/problems/word-ladder/</a></p><hr /><p>由于这一题不需要不需要输出结果的具体值，因此没必要使用DFS跟踪变换过程，直接使用BFS获取结果长度即可。此外也不需要使用map，直接使用一个set统计已经访问过的单词即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>ladderLength</span><span>(</span><span>String</span><span><span> </span><span>beginWord</span><span>, </span></span><span>String</span><span><span> </span><span>endWord</span><span>, </span></span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>wordList</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>dict</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;(wordList);</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// wordList does not contain endWord</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>dict</span><span>.</span><span>contains</span><span>(endWord)) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>begin</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span><span>&lt;&gt;(), end </span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span><span>&lt;&gt;(), visited </span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>11</div></div><div><span>        </span><span>begin</span><span>.</span><span>add</span><span>(beginWord);</span></div></div><div><div><div>12</div></div><div><span>        </span><span>end</span><span>.</span><span>add</span><span>(endWord);</span></div></div><div><div><div>13</div></div><div><span>        </span><span>visited</span><span>.</span><span>add</span><span>(beginWord);</span></div></div><div><div><div>14</div></div><div><span>        </span><span>visited</span><span>.</span><span>add</span><span>(endWord);</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>begin</span><span>.</span><span>isEmpty</span><span><span>() </span><span>&amp;&amp;</span><span> </span><span>!</span></span><span>end</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>// beginning set in next search</span></div></div><div><div><div>20</div></div><div><span>            </span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>newBegin</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>str</span><span> </span></span><span>:</span><span> begin) {</span></div></div><div><div><div>23</div></div><div><span>                </span><span>char</span><span><span>[] </span><span>chars</span><span> </span></span><span><span>=</span><span> </span></span><span>str</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>                </span><span>// replace an alphabet with another</span></div></div><div><div><div>26</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>chars</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>27</div></div><div><span>                    </span><span>// backup old alphabet</span></div></div><div><div><div>28</div></div><div><span>                    </span><span>char</span><span><span> </span><span>old</span><span> </span></span><span><span>=</span><span> chars[i];</span></span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>                    </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>'a'</span><span><span>; c </span><span>&lt;=</span><span> </span></span><span>'z'</span><span>; c++) {</span></div></div><div><div><div>31</div></div><div><span>                        </span><span>if</span><span><span> (c </span><span>==</span><span> old) {</span></span></div></div><div><div><div>32</div></div><div><span>                            </span><span>continue</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>                        </span></span><span>chars[i] </span><span>=</span><span> c;</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>                        </span><span>String</span><span><span> </span><span>candidate</span><span> </span></span><span><span>=</span><span> </span></span><span>String</span><span>.</span><span>valueOf</span><span>(chars);</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>                        </span><span>// new word must be in word list</span></div></div><div><div><div>39</div></div><div><span>                        </span><span>if</span><span><span> (</span><span>!</span></span><span>dict</span><span>.</span><span>contains</span><span>(candidate)) {</span></div></div><div><div><div>40</div></div><div><span>                            </span><span>continue</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>                        </span><span>// current transformation reaches the target</span></div></div><div><div><div>44</div></div><div><span>                        </span><span>if</span><span> (</span><span>end</span><span>.</span><span>contains</span><span>(candidate)) {</span></div></div><div><div><div>45</div></div><div><span><span>                            </span></span><span>result++;</span></div></div><div><div><div>46</div></div><div><span>                            </span><span>return</span><span> result;</span></div></div><div><div><div>47</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>                        </span><span>// skip visited word</span></div></div><div><div><div>50</div></div><div><span>                        </span><span>if</span><span> (</span><span>visited</span><span>.</span><span>contains</span><span>(candidate)) {</span></div></div><div><div><div>51</div></div><div><span>                            </span><span>continue</span><span>;</span></div></div><div><div><div>52</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span>                        </span><span>visited</span><span>.</span><span>add</span><span>(candidate);</span></div></div><div><div><div>55</div></div><div><span>                        </span><span>newBegin</span><span>.</span><span>add</span><span>(candidate);</span></div></div><div><div><div>56</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>57</div></div><div>
</div></div><div><div><div>58</div></div><div><span>                    </span><span>// restore old word</span></div></div><div><div><div>59</div></div><div><span><span>                    </span></span><span>chars[i] </span><span>=</span><span> old;</span></div></div><div><div><div>60</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>61</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>62</div></div><div>
</div></div><div><div><div>63</div></div><div><span>            </span><span>// one transformation</span></div></div><div><div><div>64</div></div><div><span><span>            </span></span><span>result++;</span></div></div><div><div><div>65</div></div><div>
</div></div><div><div><div>66</div></div><div><span>            </span><span>// optional, swap newBegin and end to speed up</span></div></div><div><div><div>67</div></div><div><span>            </span><span>if</span><span> (</span><span>newBegin</span><span>.</span><span>size</span><span><span>() </span><span>&gt;</span><span> </span></span><span>end</span><span>.</span><span>size</span><span>()) {</span></div></div><div><div><div>68</div></div><div><span>                </span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>temp</span><span> </span></span><span><span>=</span><span> newBegin;</span></span></div></div><div><div><div>69</div></div><div><span><span>                </span></span><span>newBegin </span><span>=</span><span> end;</span></div></div><div><div><div>70</div></div><div><span><span>                </span></span><span>end </span><span>=</span><span> temp;</span></div></div><div><div><div>71</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>72</div></div><div>
</div></div><div><div><div>73</div></div><div><span><span>            </span></span><span>begin </span><span>=</span><span> newBegin;</span></div></div><div><div><div>74</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>75</div></div><div>
</div></div><div><div><div>76</div></div><div><span>        </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>77</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>78</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>128. Longest Consecutive Sequence<a href="#128-longest-consecutive-sequence"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-consecutive-sequence/" target="_blank">https://leetcode.com/problems/longest-consecutive-sequence/</a></p><hr /><p>第一种做法，利用Set的迭代器，移除当前元素的相邻元素，统计能移除的最大个数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>longestConsecutive</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>set</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>set</span><span>.</span><span>add</span><span>(num);</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>13</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>set</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>int</span><span><span> </span><span>base</span><span> </span></span><span><span>=</span><span> </span></span><span>set</span><span>.</span><span>iterator</span><span>().</span><span>next</span><span>();</span></div></div><div><div><div>15</div></div><div><span>            </span><span>set</span><span>.</span><span>remove</span><span>(base);</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>// start from base, remove adjacent elements</span></div></div><div><div><div>18</div></div><div><span>            </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> base, right </span><span>=</span><span> base;</span></span></div></div><div><div><div>19</div></div><div><span>            </span><span>while</span><span> (</span><span>set</span><span>.</span><span>remove</span><span>(--left));</span></div></div><div><div><div>20</div></div><div><span>            </span><span>while</span><span> (</span><span>set</span><span>.</span><span>remove</span><span>(++right));</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, right </span><span>-</span><span> left </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>第二种做法，利用HashMap模拟Set，提取所有key，判断有多少个连续的key在map中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>longestConsecutive</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>HashMap</span><span>&lt;</span><span>Integer</span><span>, </span><span>Boolean</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(nums[i], </span><span>true</span><span>);</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>Integer</span><span><span> </span><span>key</span></span><span>:</span><span> </span><span>map</span><span>.</span><span>keySet</span><span>()) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>// avoid repeat counting</span></div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>map</span><span>.</span><span>containsKey</span><span><span>(key </span><span>-</span><span> </span></span><span>1</span><span>)) {</span></div></div><div><div><div>12</div></div><div><span>                </span><span>int</span><span><span> </span><span>length</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>                </span><span>while</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span><span>(key </span><span>+</span><span> length)) {</span></span></div></div><div><div><div>15</div></div><div><span><span>                    </span></span><span>length++;</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, length);</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>129. Sum Root to Leaf Numbers<a href="#129-sum-root-to-leaf-numbers"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sum-root-to-leaf-numbers/" target="_blank">https://leetcode.com/problems/sum-root-to-leaf-numbers/</a></p><hr /><p>自顶向下，每达到一个节点，<code>sum</code>乘10再加上当前节点的值。如果当前节点有儿子，继续向下递归计算子树中的值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>sumNumbers</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> </span><span>helper</span><span>(root, </span><span>0</span><span>);</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>helper</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>, </span></span><span>int</span><span><span> </span><span>sum</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>int</span><span><span> </span><span>updatedVal</span><span> </span></span><span><span>=</span><span> sum </span><span>*</span><span> </span></span><span>10</span><span><span> </span><span>+</span><span> </span></span><span>node</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>if</span><span> (</span><span>node</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>node</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>return</span><span> updatedVal;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>return</span><span> </span><span>helper</span><span>(</span><span>node</span><span>.</span><span>left</span><span><span>, updatedVal) </span><span>+</span><span> </span></span><span>helper</span><span>(</span><span>node</span><span>.</span><span>right</span><span>, updatedVal);</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>130. Surrounded Regions<a href="#130-surrounded-regions"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/surrounded-regions/" target="_blank">https://leetcode.com/problems/surrounded-regions/</a></p><hr /><p>使用DFS：</p><ul>
<li>从矩阵边缘开始检查，如果某个元素为<code>'O'</code>，将这个元素以及邻近的<code>'O'</code>都改为<code>'E'</code>。这些格子没有完全被<code>'X'</code>包围，因此需要排除</li>
<li>将图上剩余所有的<code>'O'</code>改为<code>'X'</code>，再将所有的<code>'E'</code>改为<code>'O'</code></li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>solve</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (board </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>board</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>board</span><span>.</span><span>length</span><span><span>, col </span><span>=</span><span> board[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// exclude 'O' om first and last columns</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> row; i++) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span> (board[i][</span><span>0</span><span><span>] </span><span>==</span><span> </span></span><span>'O'</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>                </span><span>dfs</span><span>(board, i, </span><span>0</span><span>);</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span><span> (board[i][col </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>==</span><span> </span></span><span>'O'</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>                </span><span>dfs</span><span><span>(board, i, col </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>// exclude 'O' in first and last rows</span></div></div><div><div><div>19</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> col; j++) {</span></span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span> (board[</span><span>0</span><span><span>][j] </span><span>==</span><span> </span></span><span>'O'</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>                </span><span>dfs</span><span>(board, </span><span>0</span><span>, j);</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>            </span><span>if</span><span><span> (board[row </span><span>-</span><span> </span></span><span>1</span><span><span>][j] </span><span>==</span><span> </span></span><span>'O'</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>                </span><span>dfs</span><span><span>(board, row </span><span>-</span><span> </span></span><span>1</span><span>, j);</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> row; i++) {</span></span></div></div><div><div><div>29</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> col; j++) {</span></span></div></div><div><div><div>30</div></div><div><span>                </span><span>if</span><span><span> (board[i][j] </span><span>==</span><span> </span></span><span>'O'</span><span>) {</span></div></div><div><div><div>31</div></div><div><span><span>                    </span></span><span>board[i][j] </span><span>=</span><span> </span><span>'X'</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>                </span><span>// restore excluded grids</span></div></div><div><div><div>35</div></div><div><span>                </span><span>if</span><span><span> (board[i][j] </span><span>==</span><span> </span></span><span>'E'</span><span>) {</span></div></div><div><div><div>36</div></div><div><span><span>                    </span></span><span>board[i][j] </span><span>=</span><span> </span><span>'O'</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>43</div></div><div><span>        </span><span>if</span><span><span> (x </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> x </span><span>&gt;</span><span> </span></span><span>board</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>||</span><span> y </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> y </span><span>&gt;</span><span> board[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>||</span><span> board[x][y] </span><span>==</span><span> </span></span><span>'E'</span><span><span> </span><span>||</span><span> board[x][y] </span><span>==</span><span> </span></span><span>'X'</span><span>) {</span></div></div><div><div><div>44</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>        </span><span>// exclude this grid since it is not surrounded by 'X' 4-directionally</span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>board[x][y] </span><span>=</span><span> </span><span>'E'</span><span>;</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>        </span><span>dfs</span><span><span>(board, x </span><span>+</span><span> </span></span><span>1</span><span>, y);</span></div></div><div><div><div>51</div></div><div><span>        </span><span>dfs</span><span><span>(board, x </span><span>-</span><span> </span></span><span>1</span><span>, y);</span></div></div><div><div><div>52</div></div><div><span>        </span><span>dfs</span><span><span>(board, x, y </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>53</div></div><div><span>        </span><span>dfs</span><span><span>(board, x, y </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>54</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>131. Palindrome Partitioning<a href="#131-palindrome-partitioning"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/palindrome-partitioning/" target="_blank">https://leetcode.com/problems/palindrome-partitioning/</a></p><hr /><p>使用回溯算法，从当前<code>index</code>开始，截取<code>s[index : i+1]</code>的字符串，判断是否为回文串；之后再判断<code>s[i+1 : ]</code>是否存在回文串。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt;</span><span> </span></span><span>partition</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>        </span><span>backtrack</span><span>(result, </span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;(), s, </span><span>0</span><span>);</span></div></div><div><div><div>8</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>temp</span><span>, </span></span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>if</span><span><span> (index </span><span>==</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;(temp));</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> index; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>if</span><span> (</span><span>isPalindrome</span><span>(s, index, i)) {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>temp</span><span>.</span><span>add</span><span>(</span><span>s</span><span>.</span><span>substring</span><span><span>(index, i </span><span>+</span><span> </span></span><span>1</span><span>));</span></div></div><div><div><div>20</div></div><div><span>                </span><span>backtrack</span><span><span>(result, temp, s, i </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>21</div></div><div><span>                </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isPalindrome</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>int</span><span><span> </span><span>left</span><span>, </span></span><span>int</span><span><span> </span><span>right</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>28</div></div><div><span>            </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(left) </span><span>!=</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span>(right)) {</span></div></div><div><div><div>29</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>left++;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>right--;</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>132. Palindrome Partitioning II<a href="#132-palindrome-partitioning-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/palindrome-partitioning-ii/" target="_blank">https://leetcode.com/problems/palindrome-partitioning-ii/</a></p><hr /><p>使用动态规划，其中<code>dp[i]</code>表示<code>s[:i]</code>的范围内共需要多少次分割才能满足题意。</p><p>观察发现，如果<code>s[left:right]</code>是回文串，那么可以考虑将<code>s[left:right]</code>这个字符串分割出来，截止到下标<code>right</code>时，<code>dp[right]</code>的组成就是<code>s[:left - 1]</code>之内的分割数量，再加上<code>s[left:right]</code>这一次分割。</p><p>当然，随着<code>left</code>和<code>right</code>的不断外扩，也许我们能找到更长的回文串，这样也可能使得总的分割次数越来越少。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minCut</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>arr</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[len </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>7</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span><span>(dp, len </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// odd or even length</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>updatePalindromeCut</span><span>(arr, i, i, dp, len);</span></div></div><div><div><div>13</div></div><div><span>            </span><span>updatePalindromeCut</span><span><span>(arr, i </span><span>-</span><span> </span></span><span>1</span><span>, i, dp, len);</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span><span> dp[len </span><span>-</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>void</span><span> </span><span>updatePalindromeCut</span><span>(</span><span>char</span><span><span>[] </span><span>str</span><span>, </span></span><span>int</span><span><span> </span><span>left</span><span>, </span></span><span>int</span><span><span> </span><span>right</span><span>, </span></span><span>int</span><span><span>[] </span><span>dp</span><span>, </span></span><span>int</span><span><span> </span><span>len</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> right </span><span>&lt;</span><span> len </span><span>&amp;&amp;</span><span> str[left] </span><span>==</span><span> str[right]) {</span></span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>dp[right] </span><span>=</span><span> left </span><span>&gt;</span><span> </span><span>0</span><span> </span><span>?</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(dp[right], dp[left </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span>)</span></div></div><div><div><div>23</div></div><div><span>                                 </span><span>:</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(dp[right], </span><span>0</span><span>);</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>left--;</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>right++;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>133. Clone Graph<a href="#133-clone-graph"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/clone-graph/" target="_blank">https://leetcode.com/problems/clone-graph/</a></p><hr /><p>使用一个map，存储新旧节点之间的映射，遇到已经复制过的节点，直接从map中获取；复制一个节点时，新节点<code>newNode</code>直接用原来的值<code>node.val</code>初始化，而<code>newNode</code>的邻居则用深度优先思想，循环从<code>node.neighbors</code>里分别调用<code>cloneGraph</code>方法复制。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public List&lt;Node&gt; neighbors;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>public Node() {</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>val = 0;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>neighbors = new ArrayList&lt;Node&gt;();</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>public Node(int _val) {</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>neighbors = new ArrayList&lt;Node&gt;();</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>public Node(int _val, ArrayList&lt;Node&gt; _neighbors) {</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>neighbors = _neighbors;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div><div><div><div>19</div></div><div><span>*/</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>22</div></div><div><span>    </span><span>// map from old to new nodes</span></div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>Node</span><span><span>,</span><span> </span></span><span>Node</span><span><span>&gt;</span><span> map </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;</span><span>Node</span><span><span>,</span><span> </span></span><span>Node</span><span><span>&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>    </span><span>public</span><span> </span><span>Node</span><span> </span><span>cloneGraph</span><span>(</span><span>Node</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>return</span><span> node;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// current node has been cloned</span></div></div><div><div><div>31</div></div><div><span>        </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span>(node)) {</span></div></div><div><div><div>32</div></div><div><span>            </span><span>return</span><span> </span><span>map</span><span>.</span><span>get</span><span>(node);</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>Node</span><span><span> </span><span>newNode</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span>(</span><span>node</span><span>.</span><span>val</span><span>, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>Node</span><span>&gt;());</span></div></div><div><div><div>36</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(node, newNode);</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>node</span><span>.</span><span>neighbors</span><span>.</span><span>size</span><span>(); i++) {</span></div></div><div><div><div>39</div></div><div><span>            </span><span>Node</span><span><span> </span><span>clonedNeighbor</span><span> </span></span><span><span>=</span><span> </span></span><span>cloneGraph</span><span>(</span><span>node</span><span>.</span><span>neighbors</span><span>.</span><span>get</span><span>(i));</span></div></div><div><div><div>40</div></div><div><span>            </span><span>newNode</span><span>.</span><span>neighbors</span><span>.</span><span>add</span><span>(clonedNeighbor);</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>        </span><span>return</span><span> newNode;</span></div></div><div><div><div>44</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>134. Gas Station<a href="#134-gas-station"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/gas-station/" target="_blank">https://leetcode.com/problems/gas-station/</a></p><hr /><p>使用一个变量<code>tankGas</code>跟踪当前油箱中的油量。如果从第<code>i</code>个加油站开到第<code>i+1</code>个加油站的路上油箱里的油量变成负数，说明油不够用，只能换一个起点。</p><p>再使用一个变量<code>totalGas</code>计算整趟旅程下来加油 - 耗油的差值，总的耗油不能比加油量多。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>canCompleteCircuit</span><span>(</span><span>int</span><span><span>[] </span><span>gas</span><span>, </span></span><span>int</span><span><span>[] </span><span>cost</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// total gas filled - total gas cost</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>totalGasDiff</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// current gas in the tank</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>tankGas</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// starting gas station's index</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>start</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>cost</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>// gas consumption amount from i-th station to (i+1)-th station</span></div></div><div><div><div>14</div></div><div><span>            </span><span>int</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> gas[i] </span><span>-</span><span> cost[i];</span></span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>// update total consumed gas</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>totalGasDiff </span><span>+=</span><span> cur;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>// update gas in the tank</span></div></div><div><div><div>20</div></div><div><span>            </span><span>// if tank drops below 0, we have to start from another station</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>tankGas </span><span>+=</span><span> cur;</span></div></div><div><div><div>22</div></div><div><span>            </span><span>if</span><span><span> (tankGas </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>start </span><span>=</span><span> i </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>tankGas </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span><span> totalGasDiff </span><span>&lt;</span><span> </span></span><span>0</span><span> </span><span>?</span><span><span> </span><span>-</span></span><span>1</span><span> </span><span>:</span><span> start;</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>135. Candy<a href="#135-candy"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/candy/" target="_blank">https://leetcode.com/problems/candy/</a></p><hr /><p>解题流程分为三步：</p><ol>
<li>初始分配给每个孩子一个糖</li>
<li>从左向右，确保位于右侧，<code>rating</code>更高的孩子比左侧孩子获得更多的糖</li>
<li>从右向左，确保位于左侧，<code>rating</code>更高的孩子比右侧孩子获得更多的糖。注意有可能在此前从左到右的分配中，<code>num[i - 1]</code>的值很大，因此我们需要比较<code>num[i - 1]</code>和 <code>num[i] + 1</code>的值，选更大的那个值，确保不违背之前的分发方式。</li>
</ol><p>最后只需要将结果累加即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>candy</span><span>(</span><span>int</span><span><span>[] </span><span>ratings</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>ratings</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (len </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>num</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[len </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>11</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span>(num, </span><span>1</span><span>);</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// left to right, make sure that right child with higher rating receive more candy</span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> len </span><span>-</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span><span> (ratings[i] </span><span>&lt;</span><span> ratings[i </span><span>+</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>num[i</span><span>+</span><span>1</span><span><span>] </span><span>=</span><span> num[i] </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// right to left, make sure that left child with higher rating receive more candy</span></div></div><div><div><div>21</div></div><div><span>        </span><span>// we cannot break the previous left-to-right rule as well</span></div></div><div><div><div>22</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>if</span><span><span> (ratings[i </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>&gt;</span><span> ratings[i]) {</span></span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>num[i </span><span>-</span><span> </span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span><span>(num[i </span><span>-</span><span> </span></span><span>1</span><span><span>], num[i] </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> num[i];</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>result </span><span>+=</span><span> num[</span><span>0</span><span>];</span></div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>136. Single Number<a href="#136-single-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/single-number/" target="_blank">https://leetcode.com/problems/single-number/</a></p><hr /><p>任意两个相同的数，异或值为0。遍历整个数组并不断取异或，只有single number自身无法通过成对异或得到0，因此最后的结果就是single number。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>singleNumber</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>result </span><span>^=</span><span> num;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>137. Single Number II<a href="#137-single-number-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/single-number-ii/" target="_blank">https://leetcode.com/problems/single-number-ii/</a></p><hr /><p>解决本题有2个前提：</p><ul>
<li>遇到<code>num</code>两次时，不应该记录这个数</li>
<li>遇到<code>num</code>三次后，将<code>num</code>对结果的影响清除</li>
</ul><p>结合上述前提以及上一题的解决方案，只需要在第一次和第三次遇到一个数时进行记录即可；并且，如果<code>ones ^ num == 0</code>，表示当前遇到了<code>num</code>。</p><p>由此我们拆分出两个核心步骤：</p><ol>
<li>
<p>如果没有将<code>num</code>记录在<code>ones</code>中，更新<code>ones</code>；否则不记录</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>ones </span><span>=</span><span> ones </span><span>^</span><span> num </span><span>&amp;</span><span> </span><span>~</span><span>twos</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>如果没有将<code>num</code>记录在<code>twos</code>中，更新<code>twos</code>；否则将<code>twos</code>清零</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>twos </span><span>=</span><span> twos </span><span>^</span><span> num </span><span>&amp;</span><span> </span><span>~</span><span>ones</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>singleNumber</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>ones</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, twos </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>ones </span><span>=</span><span> ones </span><span>^</span><span> num </span><span>&amp;</span><span> </span><span>~</span><span>twos;</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>twos </span><span>=</span><span> twos </span><span>^</span><span> num </span><span>&amp;</span><span> </span><span>~</span><span>ones;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>        </span><span>return</span><span> ones;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>138. Copy List with Random Pointer<a href="#138-copy-list-with-random-pointer"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/copy-list-with-random-pointer/" target="_blank">https://leetcode.com/problems/copy-list-with-random-pointer/</a></p><hr /><p>与此前的Clone Graph问题类似，仍然是一张map，记录当前复制的进度，遇到已经复制过的节点直接从map中获取结果；并且仍然是使用递归，优先完成后续节点的复制。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>Node next;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>Node random;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>public Node(int val) {</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>this.val = val;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>this.next = null;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>this.random = null;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>}</span></div></div><div><div><div>14</div></div><div><span>*/</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>// map from old to new nodes</span></div></div><div><div><div>18</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>Node</span><span><span>,</span><span> </span></span><span>Node</span><span><span>&gt;</span><span> map </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;</span><span>Node</span><span><span>,</span><span> </span></span><span>Node</span><span><span>&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span>public</span><span> </span><span>Node</span><span> </span><span>copyRandomList</span><span>(</span><span>Node</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>21</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>// current node has been cloned</span></div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span>(head)) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>return</span><span> </span><span>map</span><span>.</span><span>get</span><span>(head);</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// copy node</span></div></div><div><div><div>31</div></div><div><span>        </span><span>Node</span><span><span> </span><span>newHead</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>32</div></div><div><span>        </span><span>newHead</span><span>.</span><span>val</span><span><span> </span><span>=</span><span> </span></span><span>head</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>33</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(head, newHead);</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>newHead</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>copyRandomList</span><span>(</span><span>head</span><span>.</span><span>next</span><span>);</span></div></div><div><div><div>36</div></div><div><span>        </span><span>newHead</span><span>.</span><span>random</span><span><span> </span><span>=</span><span> </span></span><span>copyRandomList</span><span>(</span><span>head</span><span>.</span><span>random</span><span>);</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> newHead;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>139. Word Break<a href="#139-word-break"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/word-break/" target="_blank">https://leetcode.com/problems/word-break/</a></p><hr /><p>使用动态规划，<code>dp[i]</code>表示截止至第<code>i</code>个字符时，<code>s</code>的子字符串<code>s[0:i]</code>是否符合题意。</p><p>使用两层遍历，从第<code>i-1</code>个字母开始向前搜索，如果遇到子字符串<code>s[j:i-1]</code>在<code>wordDict</code>中，并且起始下标<code>j</code>处有<code>dp[j]</code>为true，则将<code>dp[i]</code>标记为true。可以限定向前搜索的长度（<code>wordDict</code>中最长单词的长度）来加快运行时间。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>wordBreak</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>wordDict</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>dict</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;(wordDict);</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// maximum word length in wordDict</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>maxWordLen</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>each</span><span> </span></span><span>:</span><span> dict) {</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>maxWordLen </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(maxWordLen, </span><span>each</span><span>.</span><span>length</span><span>());</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>boolean</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span>[</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i </span><span>-</span><span> </span></span><span>1</span><span><span>; j </span><span>&gt;=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(</span><span>0</span><span><span>, i </span><span>-</span><span> maxWordLen); j--) {</span></span></div></div><div><div><div>16</div></div><div><span>                </span><span>if</span><span><span> (dp[j] </span><span>&amp;&amp;</span><span> </span></span><span>dict</span><span>.</span><span>contains</span><span>(</span><span>s</span><span>.</span><span>substring</span><span>(j, i))) {</span></div></div><div><div><div>17</div></div><div><span><span>                    </span></span><span>dp[i] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>18</div></div><div><span>                    </span><span>break</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> dp[</span><span>s</span><span>.</span><span>length</span><span>()];</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>140. Word Break II<a href="#140-word-break-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/word-break-ii/" target="_blank">https://leetcode.com/problems/word-break-ii/</a></p><hr /><p>使用回溯算法，尝试每一个<code>s[index:i]</code>能不能组成一个存在于<code>wordDict</code>中的单词。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>wordBreak</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>wordDict</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>backtrack</span><span>(result, s, wordDict, </span><span>0</span><span>, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;());</span></div></div><div><div><div>5</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span>, </span></span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>wordDict</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>, </span></span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>temp</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span>        </span><span>if</span><span><span> (index </span><span>==</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>String</span><span>.</span><span>join</span><span>(</span><span>" "</span><span>, temp));</span></div></div><div><div><div>11</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>// try each s[index:i]</span></div></div><div><div><div>15</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> index; i </span><span>&lt;=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>if</span><span> (</span><span>wordDict</span><span>.</span><span>contains</span><span>(</span><span>s</span><span>.</span><span>substring</span><span>(index, i))) {</span></div></div><div><div><div>17</div></div><div><span>                </span><span>temp</span><span>.</span><span>add</span><span>(</span><span>s</span><span>.</span><span>substring</span><span>(index, i));</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>                </span><span>// start index should be i now</span></div></div><div><div><div>20</div></div><div><span>                </span><span>backtrack</span><span>(result, s, wordDict, i, temp);</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>                </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>// Time: O(2^n * n)</span></div></div><div><div><div>29</div></div><div><span>// Space: O(n)</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>141. Linked List Cycle<a href="#141-linked-list-cycle"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/linked-list-cycle/" target="_blank">https://leetcode.com/problems/linked-list-cycle/</a></p><hr /><p>使用快慢指针，慢指针一次移动一格，快指针一次移动两格。如果存在环，快慢指针将在某个时刻相遇。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode(int x) {</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*         val = x;</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*         next = null;</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>12</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>13</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>hasCycle</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>slow</span><span> </span></span><span><span>=</span><span> head, fast </span><span>=</span><span> head;</span></span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>while</span><span> (</span><span>fast</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>fast</span><span>.</span><span>next</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>slow </span><span>=</span><span> </span><span>slow</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>fast </span><span>=</span><span> </span><span>fast</span><span>.</span><span>next</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>            </span><span>// fast and slow pointers will eventually meet if there is a cycle</span></div></div><div><div><div>24</div></div><div><span>            </span><span>if</span><span><span> (slow </span><span>==</span><span> fast) {</span></span></div></div><div><div><div>25</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>142. Linked List Cycle II<a href="#142-linked-list-cycle-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/linked-list-cycle-ii/" target="_blank">https://leetcode.com/problems/linked-list-cycle-ii/</a></p><hr /><p>实际上这是一个数学问题。仍然使用上一题中的快慢指针方法。假设链表头距离环起始点的距离为<code>A</code>，环起始点距离快慢指针相遇点的距离为<code>B</code>，环的长度为<code>N</code>，则：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>A + B + N = 2A + 2B (快指针比慢指针多走了一个环的距离)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>可以解得：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>N - B = A</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>即快慢指针相遇点距离链表终点的距离也为<code>A</code>，因此慢指针只需要再移动<code>A+1</code>距离，便能够回到环的起点。使用另一个指针<code>slow2</code>从头开始，与慢指针共同位移，二者相遇的位置就是环起点。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode(int x) {</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*         val = x;</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*         next = null;</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>12</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>13</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>detectCycle</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>slow</span><span> </span></span><span><span>=</span><span> head, fast </span><span>=</span><span> head;</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>while</span><span> (</span><span>fast</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>fast</span><span>.</span><span>next</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>slow </span><span>=</span><span> </span><span>slow</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>fast </span><span>=</span><span> </span><span>fast</span><span>.</span><span>next</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>            </span><span>if</span><span><span> (slow </span><span>==</span><span> fast) {</span></span></div></div><div><div><div>24</div></div><div><span>                </span><span>ListNode</span><span><span> </span><span>slow2</span><span> </span></span><span><span>=</span><span> head;</span></span></div></div><div><div><div>25</div></div><div><span>                </span><span>while</span><span><span> (slow2 </span><span>!=</span><span> slow) {</span></span></div></div><div><div><div>26</div></div><div><span><span>                    </span></span><span>slow2 </span><span>=</span><span> </span><span>slow2</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>                    </span></span><span>slow </span><span>=</span><span> </span><span>slow</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>                </span><span>return</span><span> slow;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>143. Reorder List<a href="#143-reorder-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reorder-list/" target="_blank">https://leetcode.com/problems/reorder-list/</a></p><hr /><p>解题步骤分为三步：</p><ol>
<li>寻找链表的中间元素，将链表分为两部分</li>
<li>颠倒后半部分的链表</li>
<li>调整指针顺序，将两部分链表交错相连。</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>reorderList</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>head</span><span>.</span><span>next</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// find middle element</span></div></div><div><div><div>18</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>slow</span><span> </span></span><span><span>=</span><span> head;</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>fast</span><span> </span></span><span><span>=</span><span> head;</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>while</span><span> (</span><span>fast</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>fast</span><span>.</span><span>next</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>slow </span><span>=</span><span> </span><span>slow</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>fast </span><span>=</span><span> </span><span>fast</span><span>.</span><span>next</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>// reverse the second half of the list</span></div></div><div><div><div>26</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>preMiddle</span><span> </span></span><span><span>=</span><span> slow;</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>preCurrent</span><span> </span></span><span><span>=</span><span> </span></span><span>slow</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>28</div></div><div><span>        </span><span>while</span><span> (</span><span>preCurrent</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>ListNode</span><span><span> </span><span>current</span><span> </span></span><span><span>=</span><span> </span></span><span>preCurrent</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>30</div></div><div><span>            </span><span>preCurrent</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>current</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>31</div></div><div><span>            </span><span>current</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>preMiddle</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>32</div></div><div><span>            </span><span>preMiddle</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> current;</span></span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>// merge two sub-lists</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>slow </span><span>=</span><span> head;</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>fast </span><span>=</span><span> </span><span>preMiddle</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>38</div></div><div><span>        </span><span>while</span><span><span> (slow </span><span>!=</span><span> preMiddle) {</span></span></div></div><div><div><div>39</div></div><div><span>            </span><span>preMiddle</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>fast</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>40</div></div><div><span>            </span><span>fast</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>slow</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>41</div></div><div><span>            </span><span>slow</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> fast;</span></span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>slow </span><span>=</span><span> </span><span>fast</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>fast </span><span>=</span><span> </span><span>preMiddle</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>144. Binary Tree Preorder Traversal<a href="#144-binary-tree-preorder-traversal"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-preorder-traversal/" target="_blank">https://leetcode.com/problems/binary-tree-preorder-traversal/</a></p><hr /><p>第一种做法，迭代使用栈解决问题。注意由于栈先进后出，因此要先加入每个节点的右分支。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>preorderTraversal</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>20</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>TreeNode</span><span><span>&gt; </span><span>st</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;&gt;();</span></div></div><div><div><div>24</div></div><div><span>        </span><span>st</span><span>.</span><span>push</span><span>(root);</span></div></div><div><div><div>25</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>st</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>TreeNode</span><span><span> </span><span>node</span><span> </span></span><span><span>=</span><span> </span></span><span>st</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>27</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>            </span><span>if</span><span> (</span><span>node</span><span>.</span><span>right</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>30</div></div><div><span>                </span><span>st</span><span>.</span><span>push</span><span>(</span><span>node</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>            </span><span>if</span><span> (</span><span>node</span><span>.</span><span>left</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>33</div></div><div><span>                </span><span>st</span><span>.</span><span>push</span><span>(</span><span>node</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>第二种做法，递归遍历：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>preorderTraversal</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>preorder</span><span>(result, root);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>preorder</span><span>(</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>29</div></div><div><span>        </span><span>preorder</span><span>(result, </span><span>node</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>30</div></div><div><span>        </span><span>preorder</span><span>(result, </span><span>node</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>145. Binary Tree Postorder Traversal<a href="#145-binary-tree-postorder-traversal"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-postorder-traversal/" target="_blank">https://leetcode.com/problems/binary-tree-postorder-traversal/</a></p><hr /><p>第一种做法，仍然使用栈，调整<code>st</code>和<code>result</code>添加的顺序即可：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>postorderTraversal</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>20</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>TreeNode</span><span><span>&gt; </span><span>st</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;&gt;();</span></div></div><div><div><div>24</div></div><div><span>        </span><span>st</span><span>.</span><span>push</span><span>(root);</span></div></div><div><div><div>25</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>st</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>TreeNode</span><span><span> </span><span>node</span><span> </span></span><span><span>=</span><span> </span></span><span>st</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>27</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>0</span><span>, </span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>            </span><span>if</span><span> (</span><span>node</span><span>.</span><span>left</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>30</div></div><div><span>                </span><span>st</span><span>.</span><span>push</span><span>(</span><span>node</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>            </span><span>if</span><span> (</span><span>node</span><span>.</span><span>right</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>34</div></div><div><span>                </span><span>st</span><span>.</span><span>push</span><span>(</span><span>node</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>第二种做法，递归遍历：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>postorderTraversal</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>postorder</span><span>(result, root);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>postorder</span><span>(</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>postorder</span><span>(result, </span><span>node</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>29</div></div><div><span>        </span><span>postorder</span><span>(result, </span><span>node</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>30</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>146. LRU Cache<a href="#146-lru-cache"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/lru-cache/" target="_blank">https://leetcode.com/problems/lru-cache/</a></p><hr /><p>第一种是简便做法。LRU缓存是LinkedHashMap的一种应用。对一个键执行get/put操作后，对应的键值对会移动到链表末尾，因此最末尾的元素是最近访问的。在LinkedHashMap添加元素后，会调用<code>removeEldestEntry()</code>方法，传递的参数为最久没有被访问的键值对时，如果方法返回true，这个最久的键值对就会被删除。因此，LRUCache类只需在LinkedHashMap类的基础上进行继承扩展即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>LRUCache</span><span> </span></span><span>extends</span><span><span> </span><span>LinkedHashMap</span><span>&lt;</span><span>Integer</span><span>,</span><span> </span><span>Integer</span><span>&gt;</span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> capacity</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>public</span><span> </span><span>LRUCache</span><span>(</span><span>int</span><span><span> </span><span>capacity</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>super</span><span>(capacity, </span><span>0.75F</span><span>, </span><span>true</span><span>);</span></div></div><div><div><div>7</div></div><div><span>        </span><span>this</span><span>.</span><span>capacity</span><span><span> </span><span>=</span><span> capacity;</span></span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>get</span><span>(</span><span>int</span><span><span> </span><span>key</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>11</div></div><div><span>        </span><span>return</span><span> </span><span>super</span><span>.</span><span>getOrDefault</span><span><span>(key, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>put</span><span>(</span><span>int</span><span><span> </span><span>key</span><span>, </span></span><span>int</span><span><span> </span><span>value</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>15</div></div><div><span>        </span><span>super</span><span>.</span><span>put</span><span>(key, value);</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>@</span><span>Override</span></div></div><div><div><div>19</div></div><div><span>    </span><span>protected</span><span> </span><span>boolean</span><span> </span><span>removeEldestEntry</span><span>(</span><span>Map</span><span>.</span><span>Entry</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>eldest</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> </span><span>size</span><span><span>() </span><span>&gt;</span><span> capacity;</span></span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>第二种做法，使用一个链表和一个数组。数组记录所有出现过的key与value对应的信息；而链表则负责维护最近使用过的节点情况，如果某个节点最近被使用过，就把它先从链表中删掉，再把它加到链表的尾部。这样能确保链表始终是按照最近使用时间由远到近进行排序，如果要替换节点直接从链表头选择节点替换即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Node</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>Node</span><span><span> next</span><span>,</span><span> prev</span></span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>int</span><span><span> key</span><span>,</span><span> val</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>Node</span><span>(</span><span>int</span><span><span> </span><span>key</span><span>, </span></span><span>int</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>this</span><span>.</span><span>key</span><span><span> </span><span>=</span><span> key;</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>this</span><span>.</span><span>val</span><span><span> </span><span>=</span><span> val;</span></span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>class</span><span><span> </span><span>LRUCache</span><span> </span></span><span>{</span></div></div><div><div><div>11</div></div><div><span>    </span><span>Node</span><span> map[]</span><span>;</span></div></div><div><div><div>12</div></div><div><span>    </span><span>Node</span><span><span> head</span><span>,</span><span> tail</span></span><span>;</span></div></div><div><div><div>13</div></div><div><span>    </span><span>int</span><span><span> CAP</span><span>,</span><span> SIZE</span></span><span>;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>public</span><span> </span><span>LRUCache</span><span>(</span><span>int</span><span><span> </span><span>capacity</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>CAP </span><span>=</span><span> capacity;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>SIZE </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>map </span><span>=</span><span> </span><span>new</span><span> </span><span>Node</span><span>[</span><span>10001</span><span>]; </span><span>// default max capacity is 10000</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>head </span><span>=</span><span> tail </span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>add</span><span>(</span><span>Node</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>23</div></div><div><span>        </span><span>// first node, set it as both head and tail</span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>head </span><span>=</span><span> tail </span><span>=</span><span> n;</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// add to tail</span></div></div><div><div><div>30</div></div><div><span>        </span><span>tail</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> n;</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>n</span><span>.</span><span>prev</span><span><span> </span><span>=</span><span> tail;</span></span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>tail </span><span>=</span><span> n;</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>remove</span><span>(</span><span>Node</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>36</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> tail) {</span></span></div></div><div><div><div>37</div></div><div><span>            </span><span>// remove the only node</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>head </span><span>=</span><span> tail </span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (head </span><span>==</span><span> n) {</span></span></div></div><div><div><div>40</div></div><div><span>            </span><span>// remove head node</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>head </span><span>=</span><span> </span><span>head</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (tail </span><span>==</span><span> n) {</span></span></div></div><div><div><div>43</div></div><div><span>            </span><span>// remove tail node</span></div></div><div><div><div>44</div></div><div><span><span>            </span></span><span>tail </span><span>=</span><span> </span><span>tail</span><span>.</span><span>prev</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>46</div></div><div><span>            </span><span>// find previous and next nodes, then connect them</span></div></div><div><div><div>47</div></div><div><span>            </span><span>Node</span><span><span> </span><span>prev</span><span> </span></span><span><span>=</span><span> </span></span><span>n</span><span>.</span><span>prev</span><span><span>, next </span><span>=</span><span> </span></span><span>n</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>48</div></div><div><span>            </span><span>prev</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> next;</span></span></div></div><div><div><div>49</div></div><div><span>            </span><span>next</span><span>.</span><span>prev</span><span><span> </span><span>=</span><span> prev;</span></span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>52</div></div><div>
</div></div><div><div><div>53</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>get</span><span>(</span><span>int</span><span><span> </span><span>key</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>54</div></div><div><span>        </span><span>if</span><span><span> (map[key] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>55</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>56</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>57</div></div><div>
</div></div><div><div><div>58</div></div><div><span>        </span><span>// recently used, update it's position in linked list</span></div></div><div><div><div>59</div></div><div><span>        </span><span>remove</span><span>(map[key]);</span></div></div><div><div><div>60</div></div><div><span>        </span><span>add</span><span>(map[key]);</span></div></div><div><div><div>61</div></div><div>
</div></div><div><div><div>62</div></div><div><span>        </span><span>return</span><span> map[key].</span><span>val</span><span>;</span></div></div><div><div><div>63</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>64</div></div><div>
</div></div><div><div><div>65</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>put</span><span>(</span><span>int</span><span><span> </span><span>key</span><span>, </span></span><span>int</span><span><span> </span><span>value</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>66</div></div><div><span>        </span><span>// update the value of the key, if the key exists</span></div></div><div><div><div>67</div></div><div><span>        </span><span>if</span><span><span> (map[key] </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>68</div></div><div><span>            </span><span>remove</span><span>(map[key]);</span></div></div><div><div><div>69</div></div><div><span>            </span><span>add</span><span>(map[key]);</span></div></div><div><div><div>70</div></div><div><span><span>            </span></span><span>map[key].</span><span>val</span><span><span> </span><span>=</span><span> value;</span></span></div></div><div><div><div>71</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>72</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>73</div></div><div>
</div></div><div><div><div>74</div></div><div><span>        </span><span>// need to evict a node and replace with current key</span></div></div><div><div><div>75</div></div><div><span>        </span><span>if</span><span><span> (SIZE </span><span>&gt;=</span><span> CAP) {</span></span></div></div><div><div><div>76</div></div><div><span>            </span><span>Node</span><span><span> </span><span>nodeToRemove</span><span> </span></span><span><span>=</span><span> head;</span></span></div></div><div><div><div>77</div></div><div><span>            </span><span>remove</span><span>(nodeToRemove);</span></div></div><div><div><div>78</div></div><div><span><span>            </span></span><span>map[</span><span>nodeToRemove</span><span>.</span><span>key</span><span><span>] </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>79</div></div><div><span><span>            </span></span><span>SIZE--;</span></div></div><div><div><div>80</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>81</div></div><div>
</div></div><div><div><div>82</div></div><div><span>        </span><span>Node</span><span><span> </span><span>newNode</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span>(key, value);</span></div></div><div><div><div>83</div></div><div><span>        </span><span>add</span><span>(newNode);</span></div></div><div><div><div>84</div></div><div><span><span>        </span></span><span>map[key] </span><span>=</span><span> newNode;</span></div></div><div><div><div>85</div></div><div><span><span>        </span></span><span>SIZE++;</span></div></div><div><div><div>86</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>87</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>147. Insertion Sort List<a href="#147-insertion-sort-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/insertion-sort-list/" target="_blank">https://leetcode.com/problems/insertion-sort-list/</a></p><hr /><p>使用三个指针，其中<code>pre</code>总是从链表头开始向后移动，寻找插入位置；<code>cur</code>指向当前待插入的元素；<code>next</code>指向下一个待插入的元素。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>insertionSortList</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> head;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>dummyHead</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>// current node to be inserted</span></div></div><div><div><div>20</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> head;</span></span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// pre -&gt; cur -&gt; next</span></div></div><div><div><div>23</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>pre</span><span> </span></span><span><span>=</span><span> dummyHead, next </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>while</span><span><span> (cur </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>next </span><span>=</span><span> </span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>            </span><span>// find the first element which breaks the ascending order</span></div></div><div><div><div>29</div></div><div><span>            </span><span>// this is the insertion position</span></div></div><div><div><div>30</div></div><div><span>            </span><span>while</span><span> (</span><span>pre</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>pre</span><span>.</span><span>next</span><span>.</span><span>val</span><span><span> </span><span>&lt;</span><span> </span></span><span>cur</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>pre </span><span>=</span><span> </span><span>pre</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>            </span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>pre</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>35</div></div><div><span>            </span><span>pre</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> cur;</span></span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> next;</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>            </span><span>// reset pre</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>pre </span><span>=</span><span> dummyHead;</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>return</span><span> </span><span>dummyHead</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>148. Sort List<a href="#148-sort-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sort-list/" target="_blank">https://leetcode.com/problems/sort-list/</a></p><hr /><p>Divide and conquer，不断将链表二分为左、右两部分，按顺序合并两个子链表，组成一个完整的有序链表。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>sortList</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>head</span><span>.</span><span>next</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> head;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// divide the list into two half</span></div></div><div><div><div>18</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>pre</span><span> </span></span><span><span>=</span><span> </span></span><span>null</span><span><span>, slow </span><span>=</span><span> head, fast </span><span>=</span><span> head;</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>while</span><span><span> (fast </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>fast</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>pre </span><span>=</span><span> slow;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>slow </span><span>=</span><span> </span><span>slow</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>fast </span><span>=</span><span> </span><span>fast</span><span>.</span><span>next</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>        </span><span>pre</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>l1</span><span> </span></span><span><span>=</span><span> </span></span><span>sortList</span><span>(head);</span></div></div><div><div><div>27</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>l2</span><span> </span></span><span><span>=</span><span> </span></span><span>sortList</span><span>(slow);</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> </span><span>mergeTwoLists</span><span>(l1, l2);</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>    </span><span>private</span><span> </span><span>ListNode</span><span> </span><span>mergeTwoLists</span><span>(</span><span>ListNode</span><span><span> </span><span>l1</span><span>, </span></span><span>ListNode</span><span><span> </span><span>l2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>33</div></div><div><span>        </span><span>if</span><span><span> (l1 </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>34</div></div><div><span>            </span><span>return</span><span> l2;</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>        </span><span>if</span><span><span> (l2 </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>37</div></div><div><span>            </span><span>return</span><span> l1;</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>// merge after smaller node</span></div></div><div><div><div>41</div></div><div><span>        </span><span>if</span><span> (</span><span>l1</span><span>.</span><span>val</span><span><span> </span><span>&lt;</span><span> </span></span><span>l2</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>42</div></div><div><span>            </span><span>l1</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>mergeTwoLists</span><span>(</span><span>l1</span><span>.</span><span>next</span><span>, l2);</span></div></div><div><div><div>43</div></div><div><span>            </span><span>return</span><span> l1;</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>45</div></div><div><span>            </span><span>l2</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>mergeTwoLists</span><span>(l1, </span><span>l2</span><span>.</span><span>next</span><span>);</span></div></div><div><div><div>46</div></div><div><span>            </span><span>return</span><span> l2;</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>149. Max Points on a Line<a href="#149-max-points-on-a-line"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/max-points-on-a-line/" target="_blank">https://leetcode.com/problems/max-points-on-a-line/</a></p><hr /><p>三重循环，如果两点重合，则寻找所有的重合点；否则，计算出两点连线的斜率，并遍历其他点，寻找与当前点连线斜率相同的点。每一轮循环结束后的结果是斜率相同 + 相同点的总个数。注意，如果全部点都相同，还需要在结尾进行额外判断，决定<code>samepoint</code>值是否需要 + 1。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxPoints</span><span>(</span><span>int</span><span><span>[][] </span><span>points</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (points </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span> (</span><span>points</span><span>.</span><span>length</span><span><span> </span><span>&lt;</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> </span><span>points</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>points</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>int</span><span><span> </span><span>samepoint</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i</span><span>+</span></span><span>1</span><span><span>; j </span><span>&lt;</span><span> n; j++) {</span></span></div></div><div><div><div>17</div></div><div><span>                </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>18</div></div><div><span>                </span><span>long</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> points[j][</span></span><span>0</span><span><span>] </span><span>-</span><span> points[i][</span></span><span>0</span><span>];</span></div></div><div><div><div>19</div></div><div><span>                </span><span>long</span><span><span> </span><span>y</span><span> </span></span><span><span>=</span><span> points[j][</span></span><span>1</span><span><span>] </span><span>-</span><span> points[i][</span></span><span>1</span><span>];</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>                </span><span>boolean</span><span><span> </span><span>isValidSlope</span><span> </span></span><span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>22</div></div><div><span>                </span><span>if</span><span><span> (x </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> y </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>23</div></div><div><span><span>                    </span></span><span>samepoint++;</span></div></div><div><div><div>24</div></div><div><span>                    </span><span>continue</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>                </span><span>if</span><span><span> (x </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>28</div></div><div><span><span>                    </span></span><span>isValidSlope </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>                </span><span>long</span><span><span> </span><span>interdx</span><span> </span></span><span><span>=</span><span> x </span><span>*</span><span> points[i][</span></span><span>1</span><span><span>] </span><span>-</span><span> y </span><span>*</span><span> points[i][</span></span><span>0</span><span>];</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>                </span><span>// slope exists and equal inter multiplication, or slope not exist and same point</span></div></div><div><div><div>34</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> j</span><span>+</span></span><span>1</span><span><span>; k </span><span>&lt;</span><span> n; k++) {</span></span></div></div><div><div><div>35</div></div><div><span>                    </span><span>if</span><span> (isValidSlope) {</span></div></div><div><div><div>36</div></div><div><span>                        </span><span>if</span><span><span> (interdx </span><span>==</span><span> x</span><span>*</span><span>points[k][</span></span><span>1</span><span><span>] </span><span>-</span><span> y</span><span>*</span><span>points[k][</span></span><span>0</span><span>]) {</span></div></div><div><div><div>37</div></div><div><span><span>                            </span></span><span>count++;</span></div></div><div><div><div>38</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span><span>                    </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (points[k][</span><span>0</span><span><span>] </span><span>==</span><span> points[i][</span></span><span>0</span><span>]) {</span></div></div><div><div><div>40</div></div><div><span><span>                        </span></span><span>count++;</span></div></div><div><div><div>41</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(count </span><span>+</span><span> samepoint, result);</span></span></div></div><div><div><div>45</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(samepoint </span><span>+</span><span> </span></span><span>1</span><span>, result); </span><span>// [[1,1],[1,1],[1,1]]</span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>51</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>52</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>150. Evaluate Reverse Polish Notation<a href="#150-evaluate-reverse-polish-notation"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/evaluate-reverse-polish-notation/" target="_blank">https://leetcode.com/problems/evaluate-reverse-polish-notation/</a></p><hr /><p>逆波兰式实际对应的就是树的后序遍历，根据后续遍历的顺序，我们会先遇到操作数<code>a</code>，再遇到操作数<code>b</code>，之后才是操作符。因此当我们遇到操作数的时候，直接推入栈中；遇到操作符时，从栈顶推出的操作数是先<code>b</code>再<code>a</code>，这个顺序在减法和除法中很重要。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>evalRPN</span><span>(</span><span>String</span><span><span>[] </span><span>tokens</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>a</span><span>, </span><span>b</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>st</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>s</span><span> </span></span><span>:</span><span> tokens) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span> (</span><span>s</span><span>.</span><span>equals</span><span>(</span><span>"+"</span><span>)) {</span></div></div><div><div><div>8</div></div><div><span>                </span><span>st</span><span>.</span><span>add</span><span>(</span><span>st</span><span>.</span><span>pop</span><span><span>() </span><span>+</span><span> </span></span><span>st</span><span>.</span><span>pop</span><span>());</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>s</span><span>.</span><span>equals</span><span>(</span><span>"-"</span><span>)) {</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>b </span><span>=</span><span> </span><span>st</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>a </span><span>=</span><span> </span><span>st</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>12</div></div><div><span>                </span><span>st</span><span>.</span><span>add</span><span><span>(a </span><span>-</span><span> b);</span></span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>s</span><span>.</span><span>equals</span><span>(</span><span>"*"</span><span>)) {</span></div></div><div><div><div>14</div></div><div><span>                </span><span>st</span><span>.</span><span>add</span><span>(</span><span>st</span><span>.</span><span>pop</span><span><span>() </span><span>*</span><span> </span></span><span>st</span><span>.</span><span>pop</span><span>());</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>s</span><span>.</span><span>equals</span><span>(</span><span>"/"</span><span>)) {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>b </span><span>=</span><span> </span><span>st</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>a </span><span>=</span><span> </span><span>st</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>18</div></div><div><span>                </span><span>st</span><span>.</span><span>add</span><span><span>(a </span><span>/</span><span> b);</span></span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>20</div></div><div><span>                </span><span>st</span><span>.</span><span>add</span><span>(</span><span>Integer</span><span>.</span><span>parseInt</span><span>(s));</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> </span><span>st</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>151. Reverse Words in a String<a href="#151-reverse-words-in-a-string"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reverse-words-in-a-string/" target="_blank">https://leetcode.com/problems/reverse-words-in-a-string/</a></p><hr /><p>使用<code>trim()</code>函数除去起始的空白，再使用<code>split()</code>函数分割每个单词，汇集成一个单词数组。之后倒序输出所有单词，并添加空格。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>reverseWords</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// trim preceding &amp; leading whitespaces, then split by " "</span></div></div><div><div><div>6</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>words</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>trim</span><span>().</span><span>split</span><span>(</span><span>" "</span><span>);</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>words</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>if</span><span> (words[i].</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>                </span><span>sb</span><span>.</span><span>append</span><span>(words[i]);</span></div></div><div><div><div>11</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>                    </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>" "</span><span>);</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>152. Maximum Product Subarray<a href="#152-maximum-product-subarray"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/maximum-product-subarray/" target="_blank">https://leetcode.com/problems/maximum-product-subarray/</a></p><hr /><p>从左向右遍历一遍，不断累乘，如果当前乘积为0需要重新修改为1。</p><p>考虑到存在负数的情况（例如[3, -1, 4])，可能会导致数组被负数分割成若干部分，因此从左到右不一定能找到最大子区间。因此我们还需要从右向左再遍历一次，确保筛选出最大子序列。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxProduct</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span><span>, product </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>product </span><span>*=</span><span> nums[i];</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, product);</span></div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span><span> (product </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>product </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>product </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>17</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>product </span><span>*=</span><span> nums[i];</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, product);</span></div></div><div><div><div>21</div></div><div><span>            </span><span>if</span><span><span> (product </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>product </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>153. Find Minimum in Rotated Sorted Array<a href="#153-find-minimum-in-rotated-sorted-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/" target="_blank">https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/</a></p><hr /><p>这题借鉴了此前Search in Rotated Sorted Array的数组对半划分思想，通过比较<code>nums[left]</code>、<code>nums[mid]</code>和<code>nums[right]</code>确定下一轮的搜索区间。</p><p>如果<code>nums[mid]</code>不小于边界两个值，说明<code>nums[left, mid]</code>是一段递增序列，最小值在<code>nums[mid + 1, right]</code>中；反之，最小值在<code>nums[left, mid]</code>中。因为我们希望找到数组最小值，根据左边界查找思想，在确定最小值所在范围后我们仍然希望尽量向左扩展范围，试图能在范围中找到更小的值符合要求。</p><p>注意这题还可以用辅助加速的手段快速检查<code>nums[mid]</code>值是否为最小值，提升运行效率。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findMin</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>return</span><span> nums[</span><span>0</span><span>];</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>            </span><span>// optional speed-up, quickly determine if nums[mid] is minimum</span></div></div><div><div><div>16</div></div><div><span>            </span><span>if</span><span><span> (mid </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> nums[mid] </span><span>&lt;</span><span> nums[mid </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>17</div></div><div><span>                </span><span>return</span><span> nums[mid];</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span><span> (nums[left] </span><span>&lt;=</span><span> nums[mid] </span><span>&amp;&amp;</span><span> nums[right] </span><span>&lt;</span><span> nums[mid]) {</span></span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid;</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> nums[left];</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>154. Find Minimum in Rotated Sorted Array II<a href="#154-find-minimum-in-rotated-sorted-array-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/" target="_blank">https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/</a></p><hr /><p>最小值初始情况下在肯定在<code>nums[0, nums.length - 1]</code>之间。分类讨论：</p><ul>
<li>如果<code>nums[mid] &gt; nums[right]</code>，最小值在<code>nums[mid + 1, right]</code>之间，因此有<code>left = mid + 1</code></li>
<li>如果<code>nums[mid] &lt; nums[left]</code>，最小值在<code>nums[left + 1, mid]</code>之间，因此有<code>right = mid</code>；同时我们也知道<code>nums[left]</code>不可能是最小值，因此让<code>left++</code>稍微加快一些运行效率</li>
<li>其他情况下，对应<code>nums[left] &lt;= nums[mid] &lt;= nums[right]</code>，我们只知道最小值为<code>nums[left]</code>，不知道<code>nums[mid]</code>和两端的关系，因此只能让<code>right--</code></li>
</ul><p>完成二分查找循环后，<code>left</code>与<code>right</code>相等，返回<code>nums[left]</code>即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findMin</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>return</span><span> nums[</span><span>0</span><span>];</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span><span> (nums[right] </span><span>&lt;</span><span> nums[mid]) {</span></span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[mid] </span><span>&lt;</span><span> nums[left]) {</span></span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid;</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>left++;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>right--;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> nums[left];</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>155. Min Stack<a href="#155-min-stack"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/min-stack/" target="_blank">https://leetcode.com/problems/min-stack/</a></p><hr /><p>主体可以构造一个链表存储。对于最小值的跟踪，可以在push时顺便完成，直接和当前头元素中存储的已有最小值比较，节省搜索的时间。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>MinStack</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>class</span><span><span> </span><span>Node</span><span> </span></span><span>{</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span> val</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span> min</span><span>;</span></div></div><div><div><div>6</div></div><div><span>        </span><span>Node</span><span> next</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>private</span><span> </span><span>Node</span><span>(</span><span>int</span><span><span> </span><span>val</span><span>, </span></span><span>int</span><span><span> </span><span>min</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span>            </span><span>this</span><span>(val, min, </span><span>null</span><span>);</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>private</span><span> </span><span>Node</span><span>(</span><span>int</span><span><span> </span><span>val</span><span>, </span></span><span>int</span><span><span> </span><span>min</span><span>, </span></span><span>Node</span><span><span> </span><span>next</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>this</span><span>.</span><span>val</span><span><span> </span><span>=</span><span> val;</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>this</span><span>.</span><span>min</span><span><span> </span><span>=</span><span> min;</span></span></div></div><div><div><div>15</div></div><div><span>            </span><span>this</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> next;</span></span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>private</span><span> </span><span>Node</span><span> head</span><span>;</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>/** initialize your data structure here. */</span></div></div><div><div><div>22</div></div><div><span>    </span><span>public</span><span> </span><span>MinStack</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>push</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>head </span><span>=</span><span> </span><span>new</span><span> </span><span>Node</span><span>(x, x);</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>30</div></div><div><span>            </span><span>// store global min value into each incoming node</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>head </span><span>=</span><span> </span><span>new</span><span> </span><span>Node</span><span>(x, </span><span>Math</span><span>.</span><span>min</span><span>(x, </span><span>head</span><span>.</span><span>min</span><span>), head);</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>pop</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>head </span><span>=</span><span> </span><span>head</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>top</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>40</div></div><div><span>        </span><span>return</span><span> </span><span>head</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>getMin</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>44</div></div><div><span>        </span><span>return</span><span> </span><span>head</span><span>.</span><span>min</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>156. Binary Tree Upside Down<a href="#156-binary-tree-upside-down"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-upside-down/" target="_blank">https://leetcode.com/problems/binary-tree-upside-down/</a></p><hr /><p>可以将最左支(1-2-4)视为树的骨干，其余节点视为枝叶。参考XYZ例图，旋转后骨干变成最右支，枝叶则位于左侧。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>upsideDownBinaryTree</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>root</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> root;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>newRoot</span><span> </span></span><span><span>=</span><span> </span></span><span>upsideDownBinaryTree</span><span>(</span><span>root</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// Y -&gt; Z</span></div></div><div><div><div>25</div></div><div><span>        </span><span>root</span><span>.</span><span>left</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>root</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>// Y -&gt; X</span></div></div><div><div><div>28</div></div><div><span>        </span><span>root</span><span>.</span><span>left</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> root;</span></span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// root has become a leaf now</span></div></div><div><div><div>31</div></div><div><span>        </span><span>root</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>root</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span> newRoot;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>157. Read N Characters Given Read4<a href="#157-read-n-characters-given-read4"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/read-n-characters-given-read4/" target="_blank">https://leetcode.com/problems/read-n-characters-given-read4/</a></p><hr /><p>问题限制只能使用<code>read4()</code>函数来实现<code>read()</code>函数。<code>read4()</code>函数限制了一次性读入的字符最多为4，因此<code>read()</code>函数必须不断调用<code>read4()</code>，将字符从<code>read4()</code>专用的缓存<code>read4TempBuff</code>中拷贝到自己的缓存<code>buf</code>内。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* The read4 API is defined in the parent class Reader4.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>*     int read4(char[] buf4);</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>extends</span><span><span> </span><span>Reader4</span><span> </span></span><span>{</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>// the buffer for read4 API</span></div></div><div><div><div>9</div></div><div><span>    </span><span>private</span><span> </span><span>char</span><span>[] read4TempBuff </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[</span><span>4</span><span><span>]</span><span>;</span></span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>/**</span></div></div><div><div><div>12</div></div><div><span><span>     </span></span><span>* </span><span>@param</span><span> </span><span>buf</span><span> Destination buffer</span></div></div><div><div><div>13</div></div><div><span><span>     </span></span><span>* </span><span>@param</span><span> </span><span>n</span><span>   Number of characters to read</span></div></div><div><div><div>14</div></div><div><span><span>     </span></span><span>* </span><span>@return</span><span>    The number of actual characters read</span></div></div><div><div><div>15</div></div><div><span><span>     </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>read</span><span>(</span><span>char</span><span><span>[] </span><span>buf</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>// how many characters have been read</span></div></div><div><div><div>19</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>// read 4 characters to buff</span></div></div><div><div><div>22</div></div><div><span>        </span><span>int</span><span><span> </span><span>bytes</span><span> </span></span><span><span>=</span><span> </span></span><span>read4</span><span>(read4TempBuff);</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>while</span><span><span> (bytes </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> bytes; i++) {</span></span></div></div><div><div><div>26</div></div><div><span>                </span><span>if</span><span><span> (n </span><span>==</span><span> result) {</span></span></div></div><div><div><div>27</div></div><div><span>                    </span><span>break</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>                </span><span>// copy 1 char</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>buf[result] </span><span>=</span><span> read4TempBuff[i];</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>result++;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>bytes </span><span>=</span><span> </span><span>read4</span><span>(read4TempBuff);</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>158. Read N Characters Given read4 II - Call Multiple Times<a href="#158-read-n-characters-given-read4-ii---call-multiple-times"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/" target="_blank">https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/</a></p><hr /><p>由于<code>read()</code>可能被调用多次，因此需要及时更新缓存指针，每次<code>read4()</code>读字符进来，就将字符逐个从<code>read4TempBuff</code>拷贝到<code>buf</code>，复制完一个就移动一次缓存指针。4个都复制完了，重置缓存指针到0，只有为0的时候才可以接受下一批读入的字符。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* The read4 API is defined in the parent class Reader4.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>*     int read4(char[] buf4);</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>extends</span><span><span> </span><span>Reader4</span><span> </span></span><span>{</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> buffPtr </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> bytes </span><span><span>=</span><span> </span></span><span>0</span><span><span>;</span><span> </span></span><span>// characters length read to buffer</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span>private</span><span> </span><span>char</span><span>[] read4TempBuff </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[</span><span>4</span><span><span>]</span><span>;</span></span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>/**</span></div></div><div><div><div>14</div></div><div><span><span>     </span></span><span>* </span><span>@param</span><span> </span><span>buf</span><span> Destination buffer</span></div></div><div><div><div>15</div></div><div><span><span>     </span></span><span>* </span><span>@param</span><span> </span><span>n</span><span>   Number of characters to read</span></div></div><div><div><div>16</div></div><div><span><span>     </span></span><span>* </span><span>@return</span><span>    The number of actual characters read</span></div></div><div><div><div>17</div></div><div><span><span>     </span></span><span>*/</span></div></div><div><div><div>18</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>read</span><span>(</span><span>char</span><span><span>[] </span><span>buf</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// how many characters have been read</span></div></div><div><div><div>21</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>while</span><span><span> (result </span><span>&lt;</span><span> n) {</span></span></div></div><div><div><div>24</div></div><div><span>            </span><span>// write buff when buffer is ready</span></div></div><div><div><div>25</div></div><div><span>            </span><span>if</span><span><span> (buffPtr </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>bytes </span><span>=</span><span> </span><span>read4</span><span>(read4TempBuff);</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>            </span><span>// copy chars from read4TempBuff to buf</span></div></div><div><div><div>30</div></div><div><span>            </span><span>while</span><span><span> (result </span><span>&lt;</span><span> n </span><span>&amp;&amp;</span><span> buffPtr </span><span>&lt;</span><span> bytes) {</span></span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>buf[result] </span><span>=</span><span> read4TempBuff[buffPtr];</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>result++;</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>buffPtr++;</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>            </span><span>// finish copying current 4 chars, reset to 0, ready to receive new chars</span></div></div><div><div><div>37</div></div><div><span>            </span><span>if</span><span><span> (buffPtr </span><span>==</span><span> bytes) {</span></span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>buffPtr </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>            </span><span>// read4() return a number less than 4, EOF</span></div></div><div><div><div>42</div></div><div><span>            </span><span>if</span><span><span> (bytes </span><span>&lt;</span><span> </span></span><span>4</span><span>) {</span></div></div><div><div><div>43</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>159. Longest Substring with At Most Two Distinct Characters<a href="#159-longest-substring-with-at-most-two-distinct-characters"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-substring-with-at-most-two-distinct-characters/" target="_blank">https://leetcode.com/problems/longest-substring-with-at-most-two-distinct-characters/</a></p><hr /><p>滑动窗口思想，使用一个map存储每个字符出现的次数；使用双指针<code>i</code>, <code>j</code>记录当前遍历输入字符串的前、后字符，确保map中不超过2个字符。一旦超过，就需要从前指针开始剔除一个老字符。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>lengthOfLongestSubstringTwoDistinct</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>arr</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// &lt;Character, Integer&gt;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>256</span><span>];</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// how many distinct characters in current substring</span></div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// longest substring length</span></div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, j </span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span>; j++) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>// a new character</span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span><span> (map[ arr[j] ] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>count++;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>map[ arr[j] ]++;</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>            </span><span>// more than 2 characters in current substring, delete one character</span></div></div><div><div><div>27</div></div><div><span>            </span><span>while</span><span><span> (count </span><span>&gt;</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>map[ arr[i] ]--;</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>                </span><span>// delete one</span></div></div><div><div><div>31</div></div><div><span>                </span><span>if</span><span><span> (map[ arr[i] ] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>32</div></div><div><span><span>                    </span></span><span>count--;</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, j </span><span>-</span><span> i </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>160. Intersection of Two Linked Lists<a href="#160-intersection-of-two-linked-lists"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/intersection-of-two-linked-lists/" target="_blank">https://leetcode.com/problems/intersection-of-two-linked-lists/</a></p><hr /><p>无需计算A、B链表的长度，直接分别从头到尾进行遍历，如果遇到结尾，跳转至另一链表的头部继续遍历。这样一来，如果两个链表有交集，遍历指针一定会在交集点相遇；否则，同时移动至链表结尾，返回<code>null</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode(int x) {</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*         val = x;</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*         next = null;</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>12</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>13</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>getIntersectionNode</span><span>(</span><span>ListNode</span><span><span> </span><span>headA</span><span>, </span></span><span>ListNode</span><span><span> </span><span>headB</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (headA </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> headB </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>curA</span><span> </span></span><span><span>=</span><span> headA, curB </span><span>=</span><span> headB;</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>while</span><span><span> (curA </span><span>!=</span><span> curB) {</span></span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>curA </span><span>=</span><span> (curA </span><span>==</span><span> </span><span>null</span><span>) </span><span>?</span><span> headB </span><span>:</span><span> </span><span>curA</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>curB </span><span>=</span><span> (curB </span><span>==</span><span> </span><span>null</span><span>) </span><span>?</span><span> headA </span><span>:</span><span> </span><span>curB</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> curA;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>161. One Edit Distance<a href="#161-one-edit-distance"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/one-edit-distance/" target="_blank">https://leetcode.com/problems/one-edit-distance/</a></p><hr /><p>要想在一次编辑内实现<code>s</code>, <code>t</code>两个字符串的相等，必须只有一个字符在下标<code>i</code>处不同，并且</p><ul>
<li>如果<code>s</code>, <code>t</code>等长，下标<code>i</code>之后<code>s</code>, <code>t</code>仍旧要相等</li>
<li><code>s</code>比<code>t</code>短，则<code>t</code>删掉<code>t[i]</code>之后剩余字符串和<code>s</code>从<code>s[i]</code>起的字符串相等</li>
<li><code>t</code>比<code>s</code>短，与上一种情况对应</li>
</ul><p>最后还有一种特殊情况，即最后一个字符才出现不同，需要判断两个字符串的长度差值是否为1。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isOneEditDistance</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>String</span><span><span> </span><span>t</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span>(</span><span>s</span><span>.</span><span>length</span><span>(), </span><span>t</span><span>.</span><span>length</span><span>()); i++) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>!=</span><span> </span></span><span>t</span><span>.</span><span>charAt</span><span>(i)) {</span></div></div><div><div><div>5</div></div><div><span>                </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>t</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>6</div></div><div><span>                    </span><span>return</span><span> </span><span>s</span><span>.</span><span>substring</span><span><span>(i </span><span>+</span><span> </span></span><span>1</span><span>).</span><span>equals</span><span>(</span><span>t</span><span>.</span><span>substring</span><span><span>(i </span><span>+</span><span> </span></span><span>1</span><span>));</span></div></div><div><div><div>7</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&lt;</span><span> </span></span><span>t</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>8</div></div><div><span>                    </span><span>return</span><span> </span><span>s</span><span>.</span><span>substring</span><span>(i).</span><span>equals</span><span>(</span><span>t</span><span>.</span><span>substring</span><span><span>(i </span><span>+</span><span> </span></span><span>1</span><span>));</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>10</div></div><div><span>                    </span><span>return</span><span> </span><span>s</span><span>.</span><span>substring</span><span><span>(i </span><span>+</span><span> </span></span><span>1</span><span>).</span><span>equals</span><span>(</span><span>t</span><span>.</span><span>substring</span><span>(i));</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> </span><span>Math</span><span>.</span><span>abs</span><span>(</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>t</span><span>.</span><span>length</span><span><span>()) </span><span>==</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>162. Find Peak Element<a href="#162-find-peak-element"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-peak-element/" target="_blank">https://leetcode.com/problems/find-peak-element/</a></p><hr /><p>使用二分查找，找到任意一个极大值便返回。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findPeakElement</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>5</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>            </span><span>// find a local maximum</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (nums[mid] </span><span>&lt;</span><span> nums[mid </span><span>+</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> left;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>163. Missing Ranges<a href="#163-missing-ranges"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/missing-ranges/" target="_blank">https://leetcode.com/problems/missing-ranges/</a></p><hr /><p>三步检查：</p><ol>
<li>判断<code>lower</code>和<code>nums</code>的第一个数之间的关系</li>
<li>判断每两个数之间是否产生了大于1的间隔（生成缺失区间）</li>
<li>判断<code>upper</code>和<code>nums</code>的最后一个数之间的关系</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>findMissingRanges</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>lower</span><span>, </span></span><span>int</span><span><span> </span><span>upper</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>formRange</span><span>(lower, upper)); </span><span>// generate the whole range</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// initial gap</span></div></div><div><div><div>11</div></div><div><span>        </span><span>if</span><span> (nums[</span><span>0</span><span><span>] </span><span>&gt;</span><span> lower) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>formRange</span><span>(lower,nums[</span><span>0</span><span><span>] </span><span>-</span><span> </span></span><span>1</span><span>));</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// find a gap greeater than 1</span></div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span><span> (nums[i</span><span>+</span></span><span>1</span><span><span>] </span><span>!=</span><span> nums[i] </span><span>&amp;&amp;</span><span> nums[i</span><span>+</span></span><span>1</span><span><span>] </span><span>&gt;</span><span> nums[i] </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>18</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(</span><span>formRange</span><span><span>(nums[i] </span><span>+</span><span> </span></span><span>1</span><span><span>, nums[i</span><span>+</span></span><span>1</span><span><span>] </span><span>-</span><span> </span></span><span>1</span><span>));</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// last gap</span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span> (nums[</span><span>nums</span><span>.</span><span>length</span><span>-</span><span>1</span><span><span>] </span><span>&lt;</span><span> upper) {</span></span></div></div><div><div><div>24</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>formRange</span><span>(nums[</span><span>nums</span><span>.</span><span>length</span><span>-</span><span>1</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span>, upper));</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>formRange</span><span>(</span><span>int</span><span><span> </span><span>low</span><span>, </span></span><span>int</span><span><span> </span><span>high</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span><span> low </span><span>==</span><span> high </span></span><span>?</span><span> </span><span>String</span><span>.</span><span>valueOf</span><span>(low) </span><span>:</span><span><span> (low </span><span>+</span><span> </span></span><span>"-&gt;"</span><span><span> </span><span>+</span><span> high);</span></span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>164. Maximum Gap<a href="#164-maximum-gap"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/maximum-gap/" target="_blank">https://leetcode.com/problems/maximum-gap/</a></p><hr /><p>先遍历一次数组，得出数组的最小值<code>min</code>和最大值<code>max</code>；将数组划分为若干个桶，每个桶覆盖一段区间<code>[min + (k-1)gap, min + k*gap)</code>。对于每个桶，重点记录桶内的最小值和最大值，最后比较不同桶之间最值之间的间距。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maximumGap</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&lt;</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// find minimum and maximum value of nums</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>min</span><span> </span></span><span><span>=</span><span> nums[</span></span><span>0</span><span><span>], max </span><span>=</span><span> nums[</span></span><span>0</span><span>];</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>n</span></span><span>:</span><span> nums) {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>min </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(min, n);</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>max </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(max, n);</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (min </span><span>==</span><span> max) {</span></span></div></div><div><div><div>15</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// each bucket is an interval，[min + (k-1)gap, min + k*gap)</span></div></div><div><div><div>21</div></div><div><span>        </span><span>int</span><span><span> </span><span>gap</span><span> </span></span><span><span>=</span><span> (</span></span><span>int</span><span>)</span><span>Math</span><span>.</span><span>ceil</span><span>((</span><span>double</span><span><span>)(max </span><span>-</span><span> min) </span><span>/</span><span> (n </span><span>-</span><span> </span></span><span>1</span><span>)); </span><span>// max gap must be greater than this</span></div></div><div><div><div>22</div></div><div><span>        </span><span>int</span><span><span> </span><span>bucketMin</span><span>[] </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>23</div></div><div><span>        </span><span>int</span><span><span> </span><span>bucketMax</span><span>[] </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>24</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span>(bucketMin, </span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>);</span></div></div><div><div><div>25</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span>(bucketMax, </span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>);</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>// put current number in the bucket and update this bucket's min/max value</span></div></div><div><div><div>28</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span></span><span>:</span><span> nums) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> (num </span><span>-</span><span> min) </span><span>/</span><span> gap;</span></span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>bucketMin[i] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(bucketMin[i], num);</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>bucketMax[i] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(bucketMax[i], num);</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>// for the first bucket, compare bucket's min value and num's min value</span></div></div><div><div><div>35</div></div><div><span>        </span><span>// for other buckets, compare this bucket's min value and previous bucket's max value</span></div></div><div><div><div>36</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>37</div></div><div><span>            </span><span>// only compare when the bucket is not empty</span></div></div><div><div><div>38</div></div><div><span>            </span><span>if</span><span><span> (bucketMin[i] </span><span>!=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>) {</span></div></div><div><div><div>39</div></div><div><span><span>                </span></span><span>gap </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(gap, bucketMin[i] </span><span>-</span><span> min);</span></span></div></div><div><div><div>40</div></div><div><span><span>                </span></span><span>min </span><span>=</span><span> bucketMax[i];</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>        </span><span>return</span><span> gap;</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>165. Compare Version Numbers<a href="#165-compare-version-numbers"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/compare-version-numbers/" target="_blank">https://leetcode.com/problems/compare-version-numbers/</a></p><hr /><p>使用<code>split()</code>函数，根据<code>'.'</code>提取出每个子版本号进行比较。可以调用<code>parseInt()</code>函数转化格式。比较过程中，如果较短的版本号已经遍历完毕，之后的子版本号可以看作都是0。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>compareVersion</span><span>(</span><span>String</span><span><span> </span><span>version1</span><span>, </span></span><span>String</span><span><span> </span><span>version2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>s1</span><span> </span></span><span><span>=</span><span> </span></span><span>version1</span><span>.</span><span>split</span><span>(</span><span>"</span><span>\\</span><span>."</span><span>);</span></div></div><div><div><div>4</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>s2</span><span> </span></span><span><span>=</span><span> </span></span><span>version2</span><span>.</span><span>split</span><span>(</span><span>"</span><span>\\</span><span>."</span><span>);</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(</span><span>s1</span><span>.</span><span>length</span><span>, </span><span>s2</span><span>.</span><span>length</span><span>); i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>// if version number too long, treat as 0</span></div></div><div><div><div>8</div></div><div><span>            </span><span>Integer</span><span><span> </span><span>v1</span><span> </span></span><span><span>=</span><span> i </span><span>&lt;</span><span> </span></span><span>s1</span><span>.</span><span>length</span><span> </span><span>?</span><span> </span><span>Integer</span><span>.</span><span>parseInt</span><span>(s1[i]) </span><span>:</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div><span>            </span><span>Integer</span><span><span> </span><span>v2</span><span> </span></span><span><span>=</span><span> i </span><span>&lt;</span><span> </span></span><span>s2</span><span>.</span><span>length</span><span> </span><span>?</span><span> </span><span>Integer</span><span>.</span><span>parseInt</span><span>(s2[i]) </span><span>:</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span><span> (v1 </span><span>&gt;</span><span> v2) {</span></span></div></div><div><div><div>12</div></div><div><span>                </span><span>return</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (v1 </span><span>&lt;</span><span> v2) {</span></span></div></div><div><div><div>14</div></div><div><span>                </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>166. Fraction to Recurring Decimal<a href="#166-fraction-to-recurring-decimal"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/fraction-to-recurring-decimal/" target="_blank">https://leetcode.com/problems/fraction-to-recurring-decimal/</a></p><hr /><p>解题步骤可划分为：</p><ol>
<li>确定正负号</li>
<li>将int型输入变量转化为long型，避免溢出</li>
<li>小数部分，不断倍增<code>numerator</code>,每循环做一次除法，便用map存储当前的余数以及长度。如果当前余数已经在map中，则终止循环</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>fractionToDecimal</span><span>(</span><span>int</span><span><span> </span><span>numerator</span><span>, </span></span><span>int</span><span><span> </span><span>denominator</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (numerator </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>"0"</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>StringBuffer</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuffer</span><span>();</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// determine sign</span></div></div><div><div><div>10</div></div><div><span>        </span><span>if</span><span><span> ((numerator </span><span>&gt;</span><span> </span></span><span>0</span><span><span>) </span><span>^</span><span> (denominator </span><span>&gt;</span><span> </span></span><span>0</span><span>)) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>'-'</span><span>);</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>long</span><span><span> </span><span>num</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span>((</span><span>long</span><span>) numerator);</span></div></div><div><div><div>15</div></div><div><span>        </span><span>long</span><span><span> </span><span>den</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span>((</span><span>long</span><span>) denominator);</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>sb</span><span>.</span><span>append</span><span><span>(num </span><span>/</span><span> den);</span></span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>num </span><span>%=</span><span> den;</span></div></div><div><div><div>19</div></div><div><span>        </span><span>if</span><span><span> (num </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>20</div></div><div><span>            </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>        </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>'.'</span><span>);</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// &lt;recurring decimal, recurring string length&gt;</span></div></div><div><div><div>25</div></div><div><span>        </span><span>HashMap</span><span>&lt;</span><span>Long</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>26</div></div><div><span>        </span><span>while</span><span><span> (num </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>num </span><span>*=</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>            </span><span>// detect recurring part</span></div></div><div><div><div>30</div></div><div><span>            </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span>(num)) {</span></div></div><div><div><div>31</div></div><div><span>                </span><span>sb</span><span>.</span><span>insert</span><span>((</span><span>int</span><span>) </span><span>map</span><span>.</span><span>get</span><span>(num), </span><span>'('</span><span>);</span></div></div><div><div><div>32</div></div><div><span>                </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>')'</span><span>);</span></div></div><div><div><div>33</div></div><div><span>                </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(num, </span><span>sb</span><span>.</span><span>length</span><span>());</span></div></div><div><div><div>37</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span><span>(num </span><span>/</span><span> den);</span></span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>num </span><span>%=</span><span> den;</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>167. Two Sum II - Input Array Is Sorted<a href="#167-two-sum-ii---input-array-is-sorted"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/" target="_blank">https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/</a></p><hr /><p>左右双指针法，遍历解决。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>twoSum</span><span>(</span><span>int</span><span><span>[] </span><span>numbers</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>numbers</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>2</span><span>];</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (numbers </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>numbers</span><span>.</span><span>length</span><span><span> </span><span>&lt;</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>index1</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, index2 </span><span>=</span><span> len</span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span>        </span><span>while</span><span><span> (index1 </span><span>&lt;</span><span> index2) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (numbers[index1] </span><span>+</span><span> numbers[index2] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>result[</span><span>0</span><span><span>] </span><span>=</span><span> index1 </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>result[</span><span>1</span><span><span>] </span><span>=</span><span> index2 </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>15</div></div><div><span>                </span><span>return</span><span> result;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (numbers[index1] </span><span>+</span><span> numbers[index2] </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>index1++;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>index2--;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>168. Excel Sheet Column Title<a href="#168-excel-sheet-column-title"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/excel-sheet-column-title/" target="_blank">https://leetcode.com/problems/excel-sheet-column-title/</a></p><hr /><p>相当于10进制转特殊的26进制，按位倒序添加每一位数。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>convertToTitle</span><span>(</span><span>int</span><span><span> </span><span>columnNumber</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>while</span><span><span> (columnNumber </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>columnNumber--;</span></div></div><div><div><div>7</div></div><div><span>            </span><span>result</span><span>.</span><span>insert</span><span>(</span><span>0</span><span>, (</span><span>char</span><span>)(</span><span>'A'</span><span><span> </span><span>+</span><span> columnNumber </span><span>%</span><span> </span></span><span>26</span><span>));</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>columnNumber </span><span>/=</span><span> </span><span>26</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>return</span><span> </span><span>result</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>169. Majority Element<a href="#169-majority-element"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/majority-element/" target="_blank">https://leetcode.com/problems/majority-element/</a></p><hr /><p>运用Boyer-Moore投票算法，遍历整个数组，判断当前数<code>nums[i]</code>是否和当前的<code>candidate</code>相等，进而加减投票。由于输入数据中一定存在一个出现次数超过一半的元素，所以遍历完数组后数组中一定会存在至少一个元素，即majority element。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>majorityElement</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// current candicate and its occurrence</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, candidate </span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>// set as current new candidate</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (count </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>candidate </span><span>=</span><span> nums[i];</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>// "vote" for current candidate, or "vote" for others</span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span><span> (nums[i] </span><span>==</span><span> candidate) {</span></span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>count++;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>count--;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> candidate;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>170. Two Sum III - Data structure design<a href="#170-two-sum-iii---data-structure-design"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/two-sum-iii-data-structure-design/" target="_blank">https://leetcode.com/problems/two-sum-iii-data-structure-design/</a></p><hr /><p>用ArrayList存储每个添加的数字；使用HashMap存储每个数字出现的次数。每次添加一个数字后，就立即更新当前list内的最小值和最大值，这样能在<code>find()</code>时提前判定不合理范围，节省时间。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>TwoSum</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>// all numbers</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> list </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>// every number's occurrence</span></div></div><div><div><div>7</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>Integer</span><span><span>,</span><span> </span></span><span>Integer</span><span><span>&gt;</span><span> map </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>// record max and minimum value</span></div></div><div><div><div>10</div></div><div><span>    </span><span>int</span><span><span> max</span><span>,</span><span> min</span></span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>13</div></div><div><span>    </span><span>public</span><span> </span><span>TwoSum</span><span><span>()</span><span> </span><span>{}</span></span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>/** Add the number to an internal data structure.. */</span></div></div><div><div><div>16</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>add</span><span>(</span><span>int</span><span><span> </span><span>number</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>17</div></div><div><span>        </span><span>list</span><span>.</span><span>add</span><span>(number);</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>min </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(number, min);</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>max </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(number, max);</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(number, </span><span>map</span><span>.</span><span>getOrDefault</span><span>(number, </span><span>0</span><span><span>) </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>/** Find if there exists any pair of numbers which sum is equal to the value. */</span></div></div><div><div><div>26</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>find</span><span>(</span><span>int</span><span><span> </span><span>value</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>if</span><span><span> (value </span><span>&lt;</span><span> </span></span><span>2</span><span><span> </span><span>*</span><span> min </span><span>||</span><span> value </span><span>&gt;</span><span> </span></span><span>2</span><span><span> </span><span>*</span><span> max) {</span></span></div></div><div><div><div>28</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> list) {</span></div></div><div><div><div>32</div></div><div><span>            </span><span>int</span><span><span> </span><span>num2</span><span> </span></span><span><span>=</span><span> value </span><span>-</span><span> num;</span></span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>            </span><span>if</span><span><span> ((num </span><span>==</span><span> num2 </span><span>&amp;&amp;</span><span> </span></span><span>map</span><span>.</span><span>getOrDefault</span><span>(num, </span><span>0</span><span><span>) </span><span>&gt;</span><span> </span></span><span>1</span><span><span>) </span><span>||</span></span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>(num </span><span>!=</span><span> num2 </span><span>&amp;&amp;</span><span> </span><span>map</span><span>.</span><span>containsKey</span><span>(num2))) {</span></div></div><div><div><div>36</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>171. Excel Sheet Column Number<a href="#171-excel-sheet-column-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/excel-sheet-column-number/" target="_blank">https://leetcode.com/problems/excel-sheet-column-number/</a></p><hr /><p>遍历每个字符，进行26进制 -&gt; 10进制的转换。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>titleToNumber</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&lt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> result </span><span>*</span><span> </span><span>26</span><span><span> </span><span>+</span><span> (</span></span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'A'</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>172. Factorial Trailing Zeroes<a href="#172-factorial-trailing-zeroes"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/factorial-trailing-zeroes/" target="_blank">https://leetcode.com/problems/factorial-trailing-zeroes/</a></p><hr /><p>阶乘中的10，本质上来源于5这个因子(5*2)。考虑到每个偶数都能提供一个2作为因子，因此2因子的数量一定比5因子多，尾数0的个数只取决于5的个数。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>trailingZeroes</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>while</span><span><span> (n </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> n </span><span>/</span><span> </span><span>5</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>n </span><span>/=</span><span> </span><span>5</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>173. Binary Search Tree Iterator<a href="#173-binary-search-tree-iterator"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-search-tree-iterator/" target="_blank">https://leetcode.com/problems/binary-search-tree-iterator/</a></p><hr /><p>根据BST的特点，观察如果按照中序遍历从左到右遍历整颗BST，将得到一个有序的list。每次调用<code>next()</code>函数获取当前树中最小值时，其实就是获取list当前的头元素。不断使用<code>poll()</code>函数清空list，最终list为空时，<code>hasNext()</code>便返回false。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>BSTIterator</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>    </span><span>LinkedList</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> tree </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span>public</span><span> </span><span>BSTIterator</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>21</div></div><div><span>        </span><span>visit</span><span>(root);</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span>void</span><span> </span><span>visit</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// in-order</span></div></div><div><div><div>30</div></div><div><span>        </span><span>visit</span><span>(</span><span>root</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>31</div></div><div><span>        </span><span>tree</span><span>.</span><span>offer</span><span>(</span><span>root</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>32</div></div><div><span>        </span><span>visit</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>/** </span><span>@return</span><span> the next smallest number */</span></div></div><div><div><div>36</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>next</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span> </span><span>tree</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>/** </span><span>@return</span><span> whether we have a next smallest number */</span></div></div><div><div><div>41</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>hasNext</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>42</div></div><div><span>        </span><span>return</span><span><span> </span><span>!</span></span><span>tree</span><span>.</span><span>isEmpty</span><span>();</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>174. Dungeon Game<a href="#174-dungeon-game"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/dungeon-game/" target="_blank">https://leetcode.com/problems/dungeon-game/</a></p><hr /><p>动态规划，从终点向起点递推。如果当前房间可以加血，并且回复的血量比相邻房间所消耗的最低血量还多，说明只需要1滴血就能进入当前的回血房间，并且继续进入下一个房间；否则，所需的最小血量就要加上当前房间所扣除的血量。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>calculateMinimumHP</span><span>(</span><span>int</span><span><span>[][] </span><span>dungeon</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>dungeon</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> dungeon[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[m</span><span>+</span></span><span>1</span><span><span>][n</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// unreachable bound</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;=</span><span> m; i++) {</span></span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>dp[i][n] </span><span>=</span><span> </span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>dp[m][i] </span><span>=</span><span> </span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// before finally enter the bottom-right room, the knight should have at least 1 health</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>dp[m][n</span><span>-</span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>dp[m</span><span>-</span><span>1</span><span><span>][n] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> m </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> n </span><span>-</span><span> </span></span><span>1</span><span><span>; j </span><span>&gt;=</span><span> </span></span><span>0</span><span>; j--) {</span></div></div><div><div><div>22</div></div><div><span>                </span><span>int</span><span><span> </span><span>minToNext</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span><span>(dp[i][j</span><span>+</span></span><span>1</span><span><span>], dp[i</span><span>+</span></span><span>1</span><span>][j]);</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>dp[i][j] </span><span>=</span><span> (dungeon[i][j] </span><span>&gt;=</span><span> minToNext) </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span><span> minToNext </span><span>-</span><span> dungeon[i][j];</span></span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> dp[</span><span>0</span><span>][</span><span>0</span><span>];</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>175. Combine Two Tables<a href="#175-combine-two-tables"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/combine-two-tables/" target="_blank">https://leetcode.com/problems/combine-two-tables/</a></p><hr /><p>两个表的<code>PersonId</code>字段可以充当桥梁。另外注意到即使<code>Address</code>表缺乏记录，也要返回<code>Person</code>表中的对应人物数据，因此需要用到<code>LEFT JOIN</code>。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> FirstName, LastName, City, </span><span>State</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Person </span><span>LEFT JOIN</span><span> </span><span>Address</span></div></div><div><div><div>3</div></div><div><span>ON</span><span> </span><span>Person</span><span>.</span><span>PersonId</span><span><span> </span><span>=</span><span> </span></span><span>Address</span><span>.</span><span>PersonId</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>176. Second Highest Salary<a href="#176-second-highest-salary"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/second-highest-salary/" target="_blank">https://leetcode.com/problems/second-highest-salary/</a></p><hr /><p>从高到低排序后，获取第二大的结果。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>(</span><span>SELECT DISTINCT</span><span> Salary</span></div></div><div><div><div>3</div></div><div><span>     </span><span>FROM</span><span> Employee</span></div></div><div><div><div>4</div></div><div><span>     </span><span>ORDER BY</span><span> Salary </span><span>DESC</span></div></div><div><div><div>5</div></div><div><span>     </span><span>LIMIT</span><span> </span><span>1</span><span> </span><span>/* LIMIT: number of rows returned */</span></div></div><div><div><div>6</div></div><div><span><span>     </span></span><span>OFFSET </span><span>1</span><span> </span><span>/* OFFSET：starting row index */</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>)</span></div></div><div><div><div>8</div></div><div><span>AS</span><span> SecondHighestSalary</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>177. Nth Highest Salary<a href="#177-nth-highest-salary"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/nth-highest-salary/" target="_blank">https://leetcode.com/problems/nth-highest-salary/</a></p><hr /><p>与上一题类似，仍然是从高到低排序，只不过OFFSET变成了<code>N - 1</code>。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>CREATE</span><span> </span><span>FUNCTION</span><span> </span><span>getNthHighestSalary</span><span>(N </span><span>INT</span><span>) </span><span>RETURNS</span><span> </span><span>INT</span></div></div><div><div><div>2</div></div><div><span>BEGIN</span></div></div><div><div><div>3</div></div><div><span>    </span><span>DECLARE</span><span> M </span><span>INT</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>SET</span><span><span> M </span><span>=</span><span> N - </span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div><span>  </span><span>RETURN</span><span> (</span></div></div><div><div><div>6</div></div><div><span>      </span><span>SELECT DISTINCT</span><span> Salary</span></div></div><div><div><div>7</div></div><div><span>      </span><span>FROM</span><span> Employee</span></div></div><div><div><div>8</div></div><div><span>      </span><span>ORDER BY</span><span> Salary </span><span>DESC</span></div></div><div><div><div>9</div></div><div><span>      </span><span>LIMIT</span><span> </span><span>1</span></div></div><div><div><div>10</div></div><div><span><span>      </span></span><span>OFFSET M</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>);</span></div></div><div><div><div>12</div></div><div><span>END</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>178. Rank Scores<a href="#178-rank-scores"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/rank-scores/" target="_blank">https://leetcode.com/problems/rank-scores/</a></p><hr /><p>第一种方法，对于当前分数，不断计算出大于等于当前分数的数量，这个数量对应排名。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> Score,</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>(</span><span>SELECT</span><span> </span><span>COUNT</span><span>(*)</span></div></div><div><div><div>3</div></div><div><span>    </span><span>FROM</span><span> (</span><span>SELECT DISTINCT</span><span> Score s </span><span>FROM</span><span> Scores) </span><span>AS</span><span> tmp </span><span>/* greater or equal to current score */</span></div></div><div><div><div>4</div></div><div><span>    </span><span>WHERE</span><span><span> s </span><span>&gt;=</span><span> Score) </span></span><span>AS</span><span> </span><span>'Rank'</span></div></div><div><div><div>5</div></div><div><span>FROM</span><span> Scores</span></div></div><div><div><div>6</div></div><div><span>ORDER BY</span><span> Score </span><span>DESC</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>第二种方法，可以直接使用<code>DENSE_RANK()</code>函数。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> Score, </span><span>DENSE_RANK</span><span>() </span><span>OVER</span><span> (</span><span>ORDER BY</span><span> Score </span><span>DESC</span><span>) </span><span>AS</span><span> </span><span>'Rank'</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Scores</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>179. Largest Number<a href="#179-largest-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/largest-number/" target="_blank">https://leetcode.com/problems/largest-number/</a></p><hr /><p>重定义<code>Arrays.sort()</code>的Comparator。如果Comparator调用的<code>compare(obj param1, obj param2)</code>函数返回结果大于0，说明排序时<code>param1</code>位于<code>param2</code>之后，达到升序的效果；等于0和小于0的情况以此类推。</p><p>为了排除字典序首字符的干扰，需要将两个待比较字符串参数<code>s1</code>，<code>s2</code>合并，即比较<code>s1+s2</code>和<code>s2+s1</code>。如果<code>s2+s1</code>“大于”<code>s1+s2</code>，排序的结果中<code>s2</code>将前于<code>s1</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>largestNumber</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>strs</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>String</span><span>[</span><span>nums</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>strs[i] </span><span>=</span><span> </span><span>String</span><span>.</span><span>valueOf</span><span>(nums[i]);</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// sort from the largest num to the smallest</span></div></div><div><div><div>13</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(strs, (</span><span>String</span><span> s1, </span><span>String</span><span> s2) </span><span>-&gt;</span><span> {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span><span> (s2 </span><span>+</span><span> s1).</span></span><span>compareTo</span><span><span>(s1 </span><span>+</span><span> s2);</span></span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>});</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// starting digit is 0, then it must be 0</span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span> (strs[</span><span>0</span><span>].</span><span>charAt</span><span>(</span><span>0</span><span><span>) </span><span>==</span><span> </span></span><span>'0'</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>"0"</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>23</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>str</span><span> </span></span><span>:</span><span> strs) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(str);</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>180. Consecutive Numbers<a href="#180-consecutive-numbers"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/consecutive-numbers/" target="_blank">https://leetcode.com/problems/consecutive-numbers/</a></p><hr /><p>自连接三遍，比较三张表是否有连续的三个ID对应的数字相等。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT DISTINCT</span><span> </span><span>l1</span><span>.</span><span>Num</span><span> </span><span>AS</span><span> ConsecutiveNums</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Logs l1, Logs l2, Logs l3</span></div></div><div><div><div>3</div></div><div><span>WHERE</span><span> </span><span>l1</span><span>.</span><span>Id</span><span><span> </span><span>=</span><span> </span></span><span>l2</span><span>.</span><span>Id</span><span> - </span><span>1</span><span> </span><span>AND</span><span> </span><span>l2</span><span>.</span><span>Id</span><span><span> </span><span>=</span><span> </span></span><span>l3</span><span>.</span><span>Id</span><span> - </span><span>1</span><span> </span><span>AND</span><span> </span><span>l1</span><span>.</span><span>Num</span><span><span> </span><span>=</span><span> </span></span><span>l2</span><span>.</span><span>Num</span><span> </span><span>AND</span><span> </span><span>l2</span><span>.</span><span>Num</span><span><span> </span><span>=</span><span> </span></span><span>l3</span><span>.</span><span>Num</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>181. Employees Earning More Than Their Managers<a href="#181-employees-earning-more-than-their-managers"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/employees-earning-more-than-their-managers/" target="_blank">https://leetcode.com/problems/employees-earning-more-than-their-managers/</a></p><hr /><p>进行一次左连接，左表是<code>Employee</code>表自身，右表选出<code>Id</code>和<code>Salary</code>即可。左表的<code>managerId</code>需要和右表的<code>id</code>相等，并且左表的工资比右表高。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>E1</span><span>.</span><span>Name</span><span> </span><span>AS</span><span> Employee</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Employee E1 </span><span>LEFT JOIN</span><span> (</span></div></div><div><div><div>3</div></div><div><span>    </span><span>SELECT</span><span> Id, Salary</span></div></div><div><div><div>4</div></div><div><span>    </span><span>FROM</span><span> Employee</span></div></div><div><div><div>5</div></div><div><span>    </span><span>GROUP BY</span><span> Id</span></div></div><div><div><div>6</div></div><div><span>) E2</span></div></div><div><div><div>7</div></div><div><span>ON</span><span> </span><span>E1</span><span>.</span><span>ManagerId</span><span><span> </span><span>=</span><span> </span></span><span>E2</span><span>.</span><span>Id</span></div></div><div><div><div>8</div></div><div><span>WHERE</span><span> </span><span>E1</span><span>.</span><span>Salary</span><span><span> </span><span>&gt;</span><span> </span></span><span>E2</span><span>.</span><span>Salary</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>182. Duplicate Emails<a href="#182-duplicate-emails"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/duplicate-emails/" target="_blank">https://leetcode.com/problems/duplicate-emails/</a></p><hr /><p>使用<code>COUNT()</code>函数，找出出现次数不止1次的邮箱。注意需要先GROUP BY Email，才能统计次数。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> Email</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Person</span></div></div><div><div><div>3</div></div><div><span>GROUP BY</span><span> Email</span></div></div><div><div><div>4</div></div><div><span>HAVING</span><span> </span><span>COUNT</span><span><span>(*) </span><span>&gt;</span><span> </span></span><span>1</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>183. Customers Who Never Order<a href="#183-customers-who-never-order"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/customers-who-never-order/" target="_blank">https://leetcode.com/problems/customers-who-never-order/</a></p><hr /><p>从<code>Customers</code>表中选出符合条件的顾客，这些顾客的ID没有出现在<code>Orders</code>表中。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>Name</span><span> </span><span>AS</span><span> Customers</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Customers</span></div></div><div><div><div>3</div></div><div><span>WHERE</span><span> Id </span><span>NOT</span><span> </span><span>IN</span><span> (</span></div></div><div><div><div>4</div></div><div><span>    </span><span>SELECT DISTINCT</span><span>(CustomerId)</span></div></div><div><div><div>5</div></div><div><span>    </span><span>FROM</span><span> Orders</span></div></div><div><div><div>6</div></div><div><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>184. Department Highest Salary<a href="#184-department-highest-salary"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/department-highest-salary/" target="_blank">https://leetcode.com/problems/department-highest-salary/</a></p><hr /><p>用一个子查询，按照每个部门选出最高的工资，得到若干<code>(DepartmentId, Salary)</code>组合；再遍历<code>Employee</code>表，找到匹配的记录。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>D</span><span>.</span><span>Name</span><span> </span><span>AS</span><span> Department, </span><span>E</span><span>.</span><span>Name</span><span> </span><span>AS</span><span> Employee, </span><span>E</span><span>.</span><span>Salary</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Employee E, Department D</span></div></div><div><div><div>3</div></div><div><span>WHERE</span><span> </span><span>E</span><span>.</span><span>DepartmentId</span><span><span> </span><span>=</span><span> </span></span><span>D</span><span>.</span><span>Id</span><span> </span><span>AND</span><span> (</span><span>E</span><span>.</span><span>DepartmentId</span><span>, </span><span>E</span><span>.</span><span>Salary</span><span>) </span><span>IN</span><span> (</span></div></div><div><div><div>4</div></div><div><span>    </span><span>SELECT</span><span> DepartmentId, </span><span>max</span><span>(Salary) </span><span>AS</span><span> max</span></div></div><div><div><div>5</div></div><div><span>    </span><span>FROM</span><span> Employee</span></div></div><div><div><div>6</div></div><div><span>    </span><span>GROUP BY</span><span> DepartmentId</span></div></div><div><div><div>7</div></div><div><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>185. Department Top Three Salaries<a href="#185-department-top-three-salaries"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/department-top-three-salaries/" target="_blank">https://leetcode.com/problems/department-top-three-salaries/</a></p><hr /><p>与上一题思路类似，仍然使用子查询。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>D</span><span>.</span><span>name</span><span> Department, </span><span>E</span><span>.</span><span>name</span><span> Employee, </span><span>E</span><span>.</span><span>salary</span><span> Salary</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Employee E, Department D</span></div></div><div><div><div>3</div></div><div><span>WHERE</span><span> </span><span>E</span><span>.</span><span>DepartmentId</span><span><span> </span><span>=</span><span> </span></span><span>d</span><span>.</span><span>Id</span><span> </span><span>AND</span><span> (</span></div></div><div><div><div>4</div></div><div><span>        </span><span>SELECT</span><span> </span><span>COUNT</span><span>(*)</span></div></div><div><div><div>5</div></div><div><span>        </span><span>FROM</span><span> (</span><span>SELECT DISTINCT</span><span> Salary, DepartmentId </span><span>FROM</span><span> Employee) T</span></div></div><div><div><div>6</div></div><div><span>        </span><span>WHERE</span><span> </span><span>T</span><span>.</span><span>DepartmentId</span><span><span> </span><span>=</span><span> </span></span><span>E</span><span>.</span><span>DepartmentId</span><span> </span><span>AND</span><span> </span><span>T</span><span>.</span><span>Salary</span><span><span> </span><span>&gt;=</span><span> </span></span><span>E</span><span>.</span><span>Salary</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>) </span><span>&lt;=</span><span> </span><span>3</span></div></div><div><div><div>8</div></div><div><span>ORDER BY</span><span> </span><span>D</span><span>.</span><span>name</span><span>, </span><span>E</span><span>.</span><span>salary</span><span> </span><span>desc</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>186. Reverse Words in a String II<a href="#186-reverse-words-in-a-string-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reverse-words-in-a-string-ii/" target="_blank">https://leetcode.com/problems/reverse-words-in-a-string-ii/</a></p><hr /><p>先颠倒整个字符串，之后利用空格或是字符串终点，判定当前单词的范围，再颠倒每一个单词。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>reverseWords</span><span>(</span><span>char</span><span><span>[] </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span> </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>reverse</span><span>(s, </span><span>0</span><span>, </span><span>s</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, j </span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>==</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span> </span><span>||</span><span> s[i] </span><span>==</span><span> </span></span><span>' '</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>                </span><span>// reverse current word</span></div></div><div><div><div>12</div></div><div><span>                </span><span>reverse</span><span><span>(s, j, i </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>                </span><span>// set j to next word's start</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>j </span><span>=</span><span> i </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span>// reverse characters in [begin, end]</span></div></div><div><div><div>21</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>reverse</span><span>(</span><span>char</span><span><span>[] </span><span>s</span><span>, </span></span><span>int</span><span><span> </span><span>begin</span><span>, </span></span><span>int</span><span><span> </span><span>end</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>while</span><span><span> (begin </span><span>&lt;</span><span> end) {</span></span></div></div><div><div><div>23</div></div><div><span>            </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> s[begin];</span></span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>s[begin] </span><span>=</span><span> s[end];</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>s[end] </span><span>=</span><span> c;</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>begin++;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>end--;</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>187. Repeated DNA Sequences<a href="#187-repeated-dna-sequences"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/repeated-dna-sequences/" target="_blank">https://leetcode.com/problems/repeated-dna-sequences/</a></p><hr /><p>使用两个集合<code>seen</code>和<code>repeated</code>。每10个字符作为一个字符串，加入到<code>seen</code>中，如果<code>seen</code>加不进去，说明已经重复出现过了，加到<code>repeated</code>去。最后将<code>repeated</code>转为list即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>findRepeatedDnaSequences</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Set</span><span><span> </span><span>seen</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span><span>(), repeated </span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>9</span><span>; i++) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>String</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>substring</span><span><span>(i, i </span><span>+</span><span> </span></span><span>10</span><span>);</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>seen</span><span>.</span><span>add</span><span>(cur)) {</span></div></div><div><div><div>9</div></div><div><span>                </span><span>repeated</span><span>.</span><span>add</span><span>(cur);</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>(repeated);</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>188. Best Time to Buy and Sell Stock IV<a href="#188-best-time-to-buy-and-sell-stock-iv"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/" target="_blank">https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/</a></p><hr /><p>当输入的<code>k</code>很大，超过<code>prices</code>的长度时，无法用完这么多次交易的次数，因此转化为最简单的情况：只要有钱赚，当天买第二天就卖。</p><p><code>k</code>不够大时，设立两个数组<code>buy</code>和<code>sell</code>，其中<code>buy[i]</code>表示第i次买入后用户剩余多少钱，<code>sell[i]</code>表示第<code>i</code>次卖出后用户剩余多少钱。显然有：</p><ul>
<li><code>buy[i]</code> = 上一次卖出后的钱 - 当前股票价格</li>
<li><code>sell[i]</code> = 当前买入之前的钱 + 当前股票价格</li>
</ul><p>视情况决定是否有必要进行交易。结果关注<code>sell[k]</code>即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxProfit</span><span>(</span><span>int</span><span><span> </span><span>k</span><span>, </span></span><span>int</span><span><span>[] </span><span>prices</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (k </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>prices</span><span>.</span><span>length</span><span><span> </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>prices</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// k is very large, let's become greedy</span></div></div><div><div><div>9</div></div><div><span>        </span><span>if</span><span><span> (k </span><span>&gt;=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>12</div></div><div><span>                </span><span>if</span><span><span> (prices[i] </span><span>&gt;</span><span> prices[i </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>result </span><span>+=</span><span> prices[i] </span><span>-</span><span> prices[i </span><span>-</span><span> </span><span>1</span><span>];</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>buy</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[k </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>21</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>sell</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[k </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>22</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span>(buy, </span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>);</span></div></div><div><div><div>23</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span>(sell, </span><span>0</span><span>);</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>for</span><span> (</span><span>Integer</span><span><span> </span><span>cur</span><span> </span></span><span>:</span><span> prices) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> k; i++) {</span></span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>buy[i] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(sell[i </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>-</span><span> cur, buy[i]);</span></span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>sell[i] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(buy[i] </span><span>+</span><span> cur, sell[i]);</span></span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>return</span><span> sell[k];</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>189. Rotate Array<a href="#189-rotate-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/rotate-array/" target="_blank">https://leetcode.com/problems/rotate-array/</a></p><hr /><p>进行三次数组倒序：</p><ol>
<li>整个数组倒序</li>
<li>前<code>k</code>个数倒序</li>
<li>剩余数倒序</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>rotate</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&lt;=</span><span> </span></span><span>1</span><span><span> </span><span>||</span><span> k </span><span>&lt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>if</span><span><span> (k </span><span>&gt;</span><span> len) {</span></span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>k </span><span>%=</span><span> len;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>reverse</span><span>(nums, </span><span>0</span><span><span>, len </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>12</div></div><div><span>        </span><span>reverse</span><span>(nums, </span><span>0</span><span><span>, k </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>13</div></div><div><span>        </span><span>reverse</span><span><span>(nums, k, len </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>reverse</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>start</span><span>, </span></span><span>int</span><span><span> </span><span>end</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>17</div></div><div><span>        </span><span>while</span><span><span> (start </span><span>&lt;</span><span> end) {</span></span></div></div><div><div><div>18</div></div><div><span>            </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> nums[start];</span></span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>nums[start] </span><span>=</span><span> nums[end];</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>nums[end] </span><span>=</span><span> temp;</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>start++;</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>end--;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>190. Reverse Bits<a href="#190-reverse-bits"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reverse-bits/" target="_blank">https://leetcode.com/problems/reverse-bits/</a></p><hr /><p>解题步骤分为3步：</p><ol>
<li><code>result</code>左移1位，空出最右的一位</li>
<li>判断当前<code>n</code>的最后一位是否为1，如果是1，<code>result</code>也要加1。因为此前<code>result</code>的最后一位肯定是0，所以这一步能保证目前<code>result</code>的最后一位和<code>n</code>的最后一位是同步的</li>
<li><code>n</code>右移一位，表示完成了一位的处理。</li>
</ol><p>循环32次，便可完成逐位转化。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>// you need treat n as an unsigned value</span></div></div><div><div><div>3</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>reverseBits</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>32</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>result </span><span>&lt;&lt;=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>            </span><span>// add 1 to result if the last bif of n is 1</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> (n </span><span>&amp;</span><span> </span><span>1</span><span>);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>// logic right shift, always complement 0</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>n </span><span>&gt;&gt;&gt;=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>191. Number of 1 Bits<a href="#191-number-of-1-bits"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/number-of-1-bits/" target="_blank">https://leetcode.com/problems/number-of-1-bits/</a></p><hr /><p>利用<code>n &amp; 1</code>提取最后一位的值，再使用右移推进至前一位。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>// you need to treat n as an unsigned value</span></div></div><div><div><div>3</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>hammingWeight</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>while</span><span><span> (n </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> (n </span><span>&amp;</span><span> </span><span>1</span><span>);</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>n </span><span>&gt;&gt;&gt;=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>192. Word Frequency<a href="#192-word-frequency"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/word-frequency/" target="_blank">https://leetcode.com/problems/word-frequency/</a></p><hr /><p>bash部分命令：</p><ul>
<li><code>cat</code>: 查看某文件的内容</li>
<li><code>tr</code>: 删除文件中控制字符或进行字符转换。<code>-s</code>参数表示删除所有重复出现字符序列，只保留第一个</li>
<li><code>sort</code>: 将文本文件内容加以排序。<code>-r</code>参数表示以相反顺序排序</li>
<li><code>uniq</code>: 检查及删除文本文件中重复出现的行列。<code>-c</code>参数表示在每列旁边显示该行重复出现的次数。</li>
<li><code>awk</code>: 文本格式化命令。 <code>awk '{print $2}'</code> 表示打印第二个字段。</li>
</ul><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> </span><span>words.txt</span><span> | </span><span>tr</span><span> </span><span>-s</span><span> </span><span>' '</span><span> </span><span>'\n'</span><span> | </span><span>sort</span><span> | </span><span>uniq</span><span> </span><span>-c</span><span> | </span><span>sort</span><span> </span><span>-r</span><span> | </span><span>awk</span><span> </span><span>'{ print $2, $1 }'</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>193. Valid Phone Numbers<a href="#193-valid-phone-numbers"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/valid-phone-numbers/" target="_blank">https://leetcode.com/problems/valid-phone-numbers/</a></p><hr /><p><code>grep</code> / <code>egrep</code>是Linux中的文本搜索工具，运用正则表达式搜索符合指定格式的字符串。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>egrep</span><span> </span><span>"^((\([0-9]{3}\) )|([0-9]{3}-))[0-9]{3}-[0-9]{4}$"</span><span> </span><span>file.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>194. Transpose File<a href="#194-transpose-file"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/transpose-file/" target="_blank">https://leetcode.com/problems/transpose-file/</a></p><hr /><p><code>awk</code>命令中，</p><ul>
<li><code>NF</code>记录域个数，此题中可以理解为文件的行数</li>
<li><code>NR</code>表示已经读取的记录数，此题可以理解为已经读取的文件行数</li>
</ul><p>同时在bash中，字符串的追加非常容易，例如<code>s = s a</code>表示将字符串<code>a</code>追加于<code>s</code>之后。完成<code>awk</code>后，还有一个<code>END</code>部分用于处理输出。其余语法与C语言近似。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>awk</span><span> </span><span>'</span></div></div><div><div><div>2</div></div><div><span>{</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>for (i = 1; i &lt;= NF; i++) {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>if (NR == 1) result[i] = $i;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>else result[i] = result[i] " " $i</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div><div><div><div>8</div></div><div><span>END {</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>for (i = 1; result[i] != ""; i++) print result[i];</span></div></div><div><div><div>10</div></div><div><span>}'</span><span> </span><span>file.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>195. Tenth Line<a href="#195-tenth-line"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/tenth-line/" target="_blank">https://leetcode.com/problems/tenth-line/</a></p><hr /><p>一种方法是使用<code>cat</code>和<code>awk</code>的组合命令：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>cat file.txt | awk 'NR == 10'</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>另一种方法是使用<code>sed</code>命令。<code>sed</code>可依照脚本的指令来处理、编辑文本文件，单位是行。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sed -n 10p file.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>其中，<code>-n</code>表示仅显示处理后的结果，<code>p</code>表示打印某个选择的数据。</p></section>
<section><h2>196. Delete Duplicate Emails<a href="#196-delete-duplicate-emails"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/delete-duplicate-emails/" target="_blank">https://leetcode.com/problems/delete-duplicate-emails/</a></p><hr /><p>将相同的邮件地址记录group by合并，只选出每一条合并记录的最小<code>id</code>，其余的<code>id</code>舍弃。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>DELETE</span><span> </span><span>FROM</span><span> Person</span></div></div><div><div><div>2</div></div><div><span>WHERE</span><span> Id </span><span>NOT</span><span> </span><span>IN</span><span> (</span></div></div><div><div><div>3</div></div><div><span>    </span><span>SELECT</span><span> </span><span>A</span><span>.</span><span>Id</span></div></div><div><div><div>4</div></div><div><span>    </span><span>FROM</span><span> (</span></div></div><div><div><div>5</div></div><div><span>        </span><span>SELECT</span><span> </span><span>Min</span><span>(Id) </span><span>AS</span><span> Id</span></div></div><div><div><div>6</div></div><div><span>        </span><span>FROM</span><span> Person</span></div></div><div><div><div>7</div></div><div><span>        </span><span>GROUP BY</span><span> Email</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>) </span><span>AS</span><span> A</span></div></div><div><div><div>9</div></div><div><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>197. Rising Temperature<a href="#197-rising-temperature"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/rising-temperature/" target="_blank">https://leetcode.com/problems/rising-temperature/</a></p><hr /><p>使用<code>TO_DAYS()</code>函数转化<code>DATE</code>形式的变量，这样一来可以进行日期的比较。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>W2</span><span>.</span><span>Id</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Weather W1, Weather W2</span></div></div><div><div><div>3</div></div><div><span>WHERE</span><span> TO_DAYS(</span><span>W2</span><span>.</span><span>RecordDate</span><span>) - TO_DAYS(</span><span>W1</span><span>.</span><span>RecordDate</span><span><span>) </span><span>=</span><span> </span></span><span>1</span><span> </span><span>AND</span><span> </span><span>W2</span><span>.</span><span>Temperature</span><span><span> </span><span>&gt;</span><span> </span></span><span>W1</span><span>.</span><span>Temperature</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>198. House Robber<a href="#198-house-robber"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/house-robber/" target="_blank">https://leetcode.com/problems/house-robber/</a></p><hr /><p>使用两个变量，<code>prev2</code>表示不考虑当前数的前一个数时，获取的最大收益；<code>prev</code>则综合比较<code>prev2</code>与当前数之和，与不考虑当前数时的收益，哪一个更大选哪个。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>rob</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// prev2: max profit without current number's prior number</span></div></div><div><div><div>8</div></div><div><span>        </span><span>// prev: max profit between (1. without current number 2. prev2 + current number)</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>prev2</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, prev </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> prev;</span></span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>prev </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(prev, prev2 </span><span>+</span><span> num);</span></span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>prev2 </span><span>=</span><span> temp;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> prev;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>199. Binary Tree Right Side View<a href="#199-binary-tree-right-side-view"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-right-side-view/" target="_blank">https://leetcode.com/problems/binary-tree-right-side-view/</a></p><hr /><p>正常情况下，不断向下搜索当前节点的右节点；但如果右节点为空，则返回搜索左节点。搜索过程中，层数和结果list的长度应当始终对应。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>rightSideView</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>helper</span><span>(result, root, </span><span>1</span><span>);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>helper</span><span>(</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>node</span><span>, </span></span><span>int</span><span><span> </span><span>depth</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>        </span><span>if</span><span> (</span><span>result</span><span>.</span><span>size</span><span><span>() </span><span>&lt;</span><span> depth) {</span></span></div></div><div><div><div>28</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>helper</span><span>(result, </span><span>node</span><span>.</span><span>right</span><span><span>, depth </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>32</div></div><div><span>        </span><span>helper</span><span>(result, </span><span>node</span><span>.</span><span>left</span><span><span>, depth </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>200. Number of Islands<a href="#200-number-of-islands"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/number-of-islands/" target="_blank">https://leetcode.com/problems/number-of-islands/</a></p><hr /><p>使用DFS，已经走过的格子需要置为0，每遇到一个’1’岛屿数就加一。这是因为如果陆地是连续的，在计数之前，在此前的DFS递归调用已经将当前岛屿的邻近’1’全部变为0了。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> row </span><span><span>=</span><span> </span></span><span>0</span><span><span>,</span><span> col </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>numIslands</span><span>(</span><span>char</span><span><span>[][] </span><span>grid</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>if</span><span> (</span><span>grid</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> grid[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>row </span><span>=</span><span> </span><span>grid</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>col </span><span>=</span><span> grid[</span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> row; i++) {</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> col; j++) {</span></span></div></div><div><div><div>15</div></div><div><span>                </span><span>if</span><span><span> (grid[i][j] </span><span>==</span><span> </span></span><span>'1'</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>                    </span><span>dfs</span><span>(grid, i, j);</span></div></div><div><div><div>17</div></div><div><span><span>                    </span></span><span>result++;</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>char</span><span><span>[][] </span><span>grid</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span><span> (x </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> y </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> x </span><span>&gt;=</span><span> row </span><span>||</span><span> y </span><span>&gt;=</span><span> col </span><span>||</span><span> grid[x][y] </span><span>!=</span><span> </span></span><span>'1'</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>grid[x][y] </span><span>=</span><span> </span><span>'0'</span><span>;</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>dfs</span><span><span>(grid, x </span><span>+</span><span> </span></span><span>1</span><span>, y);</span></div></div><div><div><div>33</div></div><div><span>        </span><span>dfs</span><span><span>(grid, x </span><span>-</span><span> </span></span><span>1</span><span>, y);</span></div></div><div><div><div>34</div></div><div><span>        </span><span>dfs</span><span><span>(grid, x, y </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>35</div></div><div><span>        </span><span>dfs</span><span><span>(grid, x, y </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2020-01-01-leetcode201-300/</id>
      <title type="text">LeetCode 201-300</title>
      <published>2020-01-01T00:00:00.000Z</published>
      <updated>2020-01-01T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2020-01-01-leetcode201-300/"/>
      <summary type="text">LeetCode Problems 201-300.</summary>
      <content type="html"><![CDATA[<p>LeetCode Problems 201-300.</p>

<section><h2>201. Bitwise AND of Numbers Range<a href="#201-bitwise-and-of-numbers-range"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/bitwise-and-of-numbers-range/" target="_blank">https://leetcode.com/problems/bitwise-and-of-numbers-range/</a></p><hr /><p>实际上，如果将<code>left</code>和<code>right</code>转化为相同长度的二进制串，按位与的结果就是两个二进制串的最长相等前缀。因此，不断右移<code>left</code>和<code>right</code>，记录移动的位数，直到<code>left</code>和<code>right</code>相等；再将<code>left</code>左移这个位数进行复原。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>rangeBitwiseAnd</span><span>(</span><span>int</span><span><span> </span><span>left</span><span>, </span></span><span>int</span><span><span> </span><span>right</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (left </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>!=</span><span> right) {</span></span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>left </span><span>&gt;&gt;&gt;=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>right </span><span>&gt;&gt;&gt;=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>count++;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span><span> left </span><span>&lt;&lt;=</span><span> count;</span></span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>202. Happy Number<a href="#202-happy-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/happy-number/" target="_blank">https://leetcode.com/problems/happy-number/</a></p><hr /><p>逐位计算<code>currentDigit</code>的平方和，累加得到当前的<code>result</code>。每计算一次当前的<code>result</code>都要确保<code>result</code>不等于1或者4（陷入循环，一定不是happy number)。确认<code>result</code>没有问题后，将其作为新一轮的输入，继续进行判断。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isHappy</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, current </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>while</span><span><span> (result </span><span>!=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>            </span><span>// calculate current result</span></div></div><div><div><div>7</div></div><div><span>            </span><span>while</span><span><span> (n </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>current </span><span>=</span><span> n </span><span>%</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>n </span><span>/=</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> current </span><span>*</span><span> current;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>// result cannot be 1 or 4, otherwise fall into loop</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span><span> (result </span><span>&gt;</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> result </span><span>!=</span><span> </span></span><span>4</span><span>) {</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>n </span><span>=</span><span> result;</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>18</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span><span> result </span><span>==</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>203. Remove Linked List Elements<a href="#203-remove-linked-list-elements"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/remove-linked-list-elements/" target="_blank">https://leetcode.com/problems/remove-linked-list-elements/</a></p><hr /><p>使用<code>cur</code>指针标记当前节点，<code>prev</code>指针标记之前一个节点。正常情况下，两个指针每一次向右移动一格；但<code>cur</code>指向的元素值与<code>val</code>相等时，<code>prev</code>指向<code>cur</code>的下一个元素，跳过<code>cur</code>，相当于删除了当前元素。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>removeElements</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>, </span></span><span>int</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> head;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>dummyHead</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>18</div></div><div><span>        </span><span>dummyHead</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> head;</span></span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>prev</span><span> </span></span><span><span>=</span><span> dummyHead, cur </span><span>=</span><span> head;</span></span></div></div><div><div><div>21</div></div><div><span>        </span><span>while</span><span><span> (cur </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>// when current element's value is val, skip</span></div></div><div><div><div>23</div></div><div><span>            </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> val) {</span></span></div></div><div><div><div>24</div></div><div><span>                </span><span>prev</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>prev </span><span>=</span><span> </span><span>prev</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>            </span><span>// always move forward cur</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span> </span><span>dummyHead</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>204. Count Primes<a href="#204-count-primes"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/count-primes/" target="_blank">https://leetcode.com/problems/count-primes/</a></p><hr /><p>此题借鉴了埃拉托斯特尼筛法的思想，即找到一个范围内的较小质数时，删去这个质数的倍数，因为他们一定是合数。</p><p>使用一个数组<code>prime</code>标记所有小于<code>n</code>的数字，如果有<code>i &lt; n</code>且<code>i</code>为合数，则<code>prime[i] = false</code>。初始情况下，所有数字都假定为质数。（初始化结果都是true）</p><p>一开始，假设比<code>n</code>小的质数有<code>n/2</code>个（即所有正奇数的个数；尽管1不是质数，但2恰好是唯一偶质数，二者抵消，数量上仍然是<code>n</code>的一半）。</p><p>由于只需要寻找奇数中的合数，从3开始遍历所有小于<code>sqrt(n)</code>的奇数。假定当前遍历的数字是<code>i</code>，如果已经能确定<code>i</code>是质数，则需要开启第二重循环，从<code>i*i</code>开始遍历至<code>n</code>。这一循环的目的是剔除掉所有<code>i</code>的若干倍数，因为它们都是合数。注意：此处的起点是<code>i*i</code>而非<code>i</code>，因为在不重复的前提下，<code>i*i</code>是通过<code>i</code>得知的最小合数（固然，<code>2*i</code>, <code>3*i</code>等等数都是合数，但是这些在<code>i == 2</code>, <code>i == 3</code>时已经考虑过了，会重复）。此外，只需要考虑<code>i*i + 偶数*i</code>的情况，因为根据奇偶性，<code>i*i + 奇数*i</code>一定是一个偶数&amp;合数。</p><p>每通过以上步骤排除一个合数，就在原始结果<code>n/2</code>的基础上减去1；同时，这个数在数组<code>prime</code>中被标记为false。之后的遍历中，遇到这些合数就可以直接跳过了。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>countPrimes</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>&lt;</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>boolean</span><span><span>[] </span><span>prime</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span>[n];</span></div></div><div><div><div>8</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span>(prime, </span><span>true</span><span>);</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// assume all odd numbers are prime number</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> n </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>3</span><span><span>; i </span><span>*</span><span> i </span><span>&lt;</span><span> n; i </span><span>+=</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>// skip a composite number</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span><span>prime[i]) {</span></span></div></div><div><div><div>16</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>// multiples of composite numbers are skipped</span></div></div><div><div><div>20</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i </span><span>*</span><span> i; j </span><span>&lt;</span><span> n; j </span><span>+=</span><span> </span></span><span>2</span><span><span> </span><span>*</span><span> i) {</span></span></div></div><div><div><div>21</div></div><div><span>                </span><span>// this multiple of i has not been excluded</span></div></div><div><div><div>22</div></div><div><span>                </span><span>if</span><span> (prime[j]) {</span></div></div><div><div><div>23</div></div><div><span><span>                    </span></span><span>result--;</span></div></div><div><div><div>24</div></div><div><span><span>                    </span></span><span>prime[j] </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>205. Isomorphic Strings<a href="#205-isomorphic-strings"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/isomorphic-strings/" target="_blank">https://leetcode.com/problems/isomorphic-strings/</a></p><hr /><p>人造两个map，使得A中相同下标的字符能对应B，B中相同下标的字符能对应A。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isIsomorphic</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>String</span><span><span> </span><span>t</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>!=</span><span> </span></span><span>t</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>sChars</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>tChars</span><span> </span></span><span><span>=</span><span> </span></span><span>t</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>sMap</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[</span><span>256</span><span>];</span></div></div><div><div><div>11</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>tMap</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[</span><span>256</span><span>];</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>sChars</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>char</span><span><span> </span><span>a</span><span> </span></span><span><span>=</span><span> sChars[i], b </span><span>=</span><span> tChars[i];</span></span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>// not yet mapped</span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span><span> (sMap[a] </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> tMap[b] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>sMap[a] </span><span>=</span><span> b;</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>tMap[b] </span><span>=</span><span> a;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (sMap[a] </span><span>!=</span><span> b </span><span>||</span><span> tMap[b] </span><span>!=</span><span> a) {</span></span></div></div><div><div><div>21</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>206. Reverse Linked List<a href="#206-reverse-linked-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reverse-linked-list/" target="_blank">https://leetcode.com/problems/reverse-linked-list/</a></p><hr /><p>第一种，使用非递归方法，用<code>prev</code>指向<code>head</code>的前一个元素。从头到尾，每一次循环都掉转一个指针的方向，即从<code>head</code>指向<code>prev</code>，再分别让两个指针向右移。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>reverseList</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>prev</span><span> </span></span><span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>18</div></div><div><span>        </span><span>while</span><span><span> (head </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>ListNode</span><span><span> </span><span>next</span><span> </span></span><span><span>=</span><span> </span></span><span>head</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>20</div></div><div><span>            </span><span>head</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> prev;</span></span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>prev </span><span>=</span><span> head;</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>head </span><span>=</span><span> next;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> prev;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>第二种，使用递归方法。与第一种方法类似，只是<code>prev</code>与<code>head</code>向前移动的迭代过程变成了递归调用。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>reverseList</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span> </span><span>reverse</span><span>(head, </span><span>null</span><span>);</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span>private</span><span> </span><span>ListNode</span><span> </span><span>reverse</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>, </span></span><span>ListNode</span><span><span> </span><span>prev</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>17</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>return</span><span> prev;</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>next</span><span> </span></span><span><span>=</span><span> </span></span><span>head</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>22</div></div><div><span>        </span><span>head</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> prev;</span></span></div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> </span><span>reverse</span><span>(next, head);</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>207. Course Schedule<a href="#207-course-schedule"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/course-schedule/" target="_blank">https://leetcode.com/problems/course-schedule/</a></p><hr /><p>此题运用DFS，将先修课程数组转化为图的形式，对于每门课程，维护一个状态数组，分别是0：未访问 1：访问中 2：已访问。在DFS的时候检查当前课程和后续课程的状态，判断是否存在两门课互为前提的情况，如果有，则说明不能安排课程。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>boolean</span><span> isCycle </span><span><span>=</span><span> </span></span><span>false</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>canFinish</span><span>(</span><span>int</span><span><span> </span><span>numCourses</span><span>, </span></span><span>int</span><span><span>[][] </span><span>prerequisites</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>graph</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> numCourses; i++) {</span></span></div></div><div><div><div>8</div></div><div><span>            </span><span>graph</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>Integer</span><span>&gt;());</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>// add all subsequent courses for each course</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>prerequisite</span><span> </span></span><span>:</span><span> prerequisites)</span></div></div><div><div><div>13</div></div><div><span>            </span><span>graph</span><span>.</span><span>get</span><span>( prerequisite[</span><span>1</span><span>] ).</span><span>add</span><span>( prerequisite[</span><span>0</span><span>] );</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>courseStatus</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[numCourses];</span></div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> numCourses; i++) {</span></span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span><span> (courseStatus[i] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>18</div></div><div><span>                </span><span>dfs</span><span>(courseStatus, i, graph);</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span><span> </span><span>!</span><span>isCycle;</span></span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>    </span><span>// 0 unvisited, 1 visiting, 2 visited</span></div></div><div><div><div>26</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span>[] </span><span>courseStatus</span><span>, </span></span><span>int</span><span><span> </span><span>node</span><span>, </span></span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>graph</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>courseStatus[node] </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>next</span><span> </span></span><span>:</span><span> </span><span>graph</span><span>.</span><span>get</span><span>(node)) {</span></div></div><div><div><div>30</div></div><div><span>            </span><span>if</span><span><span> (courseStatus[next] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>31</div></div><div><span>                </span><span>dfs</span><span>(courseStatus, next, graph);</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>            </span><span>if</span><span><span> (courseStatus[next] </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>isCycle </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>courseStatus[node] </span><span>=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>208. Implement Trie (Prefix Tree)<a href="#208-implement-trie-prefix-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/implement-trie-prefix-tree/" target="_blank">https://leetcode.com/problems/implement-trie-prefix-tree/</a></p><hr /><p>单词拆分为逐个字母，每个字母对应到一个树节点。节点存储两个信息：一个是当前节点是否为单词的最后一个字母；另一个存储所有下一个字母的信息。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Trie</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>class</span><span><span> </span><span>TrieNode</span><span> </span></span><span>{</span></div></div><div><div><div>4</div></div><div><span>        </span><span>public</span><span> </span><span>TrieNode</span><span><span>()</span><span> </span><span>{}</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>boolean</span><span> isEnd </span><span><span>=</span><span> </span></span><span>false</span><span>;</span></div></div><div><div><div>6</div></div><div><span>        </span><span>TrieNode</span><span>[] children </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span>[</span><span>26</span><span><span>]</span><span>;</span></span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>private</span><span> </span><span>TrieNode</span><span> root </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span><span>()</span><span>;</span></span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>Trie</span><span><span>()</span><span> </span><span>{}</span></span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>/** Inserts a word into the trie. */</span></div></div><div><div><div>15</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>insert</span><span>(</span><span>String</span><span><span> </span><span>word</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>16</div></div><div><span>        </span><span>TrieNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> root;</span></span></div></div><div><div><div>17</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>word</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span>();</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span>];</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>cur</span><span>.</span><span>isEnd</span><span><span> </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>/** Returns if the word is in the trie. */</span></div></div><div><div><div>28</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>search</span><span>(</span><span>String</span><span><span> </span><span>word</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>29</div></div><div><span>        </span><span>TrieNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> root;</span></span></div></div><div><div><div>30</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>word</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>31</div></div><div><span>            </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>32</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span>];</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>// must exactly match, so the word in trie should also end</span></div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> </span><span>cur</span><span>.</span><span>isEnd</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>/** Returns if there is any word in the trie that starts with the given prefix. */</span></div></div><div><div><div>42</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>startsWith</span><span>(</span><span>String</span><span><span> </span><span>prefix</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>43</div></div><div><span>        </span><span>TrieNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> root;</span></span></div></div><div><div><div>44</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>prefix</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>45</div></div><div><span>            </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>46</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>47</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span>];</span></div></div><div><div><div>49</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>52</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>209. Minimum Size Subarray Sum<a href="#209-minimum-size-subarray-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minimum-size-subarray-sum/" target="_blank">https://leetcode.com/problems/minimum-size-subarray-sum/</a></p><hr /><p>使用双指针法，<code>sum</code>总是先加上<code>nums[right]</code>，并且右指针右移；在<code>sum</code>大于<code>s</code>的前提下，再试图删去尽可能多的<code>nums[left]</code>，使得<code>left</code>和<code>right</code>差值尽量小。如果遍历完整个数组后都没有符合条件的情况，则返回0。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minSubArrayLen</span><span>(</span><span>int</span><span><span> </span><span>s</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, left </span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// By default, the minimum length is Max integer</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>while</span><span><span> (right </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>sum </span><span>+=</span><span> nums[right];</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>right++;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>// delete as many nums[left] as possible</span></div></div><div><div><div>17</div></div><div><span>            </span><span>while</span><span><span> (sum </span><span>&gt;=</span><span> s) {</span></span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(result, right </span><span>-</span><span> left);</span></span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>sum </span><span>-=</span><span> nums[left];</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>left++;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span><span> result </span><span>==</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span> </span><span>?</span><span> </span><span>0</span><span> </span><span>:</span><span> result;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>210. Course Schedule II<a href="#210-course-schedule-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/course-schedule-ii/" target="_blank">https://leetcode.com/problems/course-schedule-ii/</a></p><hr /><p>在Course Schedule的基础上添加结果数组，每个dfs到达终点时表示当前最后选修的课程，这门课程应该放置于当前结果数组的末尾。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>boolean</span><span> isCycle </span><span><span>=</span><span> </span></span><span>false</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>int</span><span>[] result</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>int</span><span> resultIndex</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>findOrder</span><span>(</span><span>int</span><span><span> </span><span>numCourses</span><span>, </span></span><span>int</span><span><span>[][] </span><span>prerequisites</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>result </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span>[numCourses];</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>resultIndex </span><span>=</span><span> numCourses </span><span>-</span><span> </span><span>1</span><span>; </span><span>// start from the last course</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>graph</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> numCourses; i++) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>graph</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>Integer</span><span>&gt;());</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// add all subsequent courses for each course</span></div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>prerequisite</span><span> </span></span><span>:</span><span> prerequisites) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>graph</span><span>.</span><span>get</span><span>( prerequisite[</span><span>1</span><span>] ).</span><span>add</span><span>( prerequisite[</span><span>0</span><span>] );</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>courseStatus</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[numCourses];</span></div></div><div><div><div>21</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> numCourses; i++) {</span></span></div></div><div><div><div>22</div></div><div><span>            </span><span>if</span><span><span> (courseStatus[i] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>                </span><span>dfs</span><span>(courseStatus, i, graph);</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> isCycle </span><span>?</span><span> </span><span>new</span><span> </span><span>int</span><span>[]{} </span><span>:</span><span> result;</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>    </span><span>// 0 unvisited, 1 visiting, 2 visited</span></div></div><div><div><div>31</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span>[] </span><span>courseStatus</span><span>, </span></span><span>int</span><span><span> </span><span>node</span><span>, </span></span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>graph</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>courseStatus[node] </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>next</span><span> </span></span><span>:</span><span> </span><span>graph</span><span>.</span><span>get</span><span>(node)) {</span></div></div><div><div><div>35</div></div><div><span>            </span><span>if</span><span><span> (courseStatus[next] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>36</div></div><div><span>                </span><span>dfs</span><span>(courseStatus, next, graph);</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>            </span><span>if</span><span><span> (courseStatus[next] </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>40</div></div><div><span><span>                </span></span><span>isCycle </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>courseStatus[node] </span><span>=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>result[resultIndex] </span><span>=</span><span> node;</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>resultIndex--;</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>211. Design Add and Search Words Data Structure<a href="#211-design-add-and-search-words-data-structure"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/design-add-and-search-words-data-structure/" target="_blank">https://leetcode.com/problems/design-add-and-search-words-data-structure/</a></p><hr /><p>借鉴Trie的思想，添加单词操作不变；搜索单词则略有变化，因为要处理<code>.</code>的情况。思路是使用<code>index</code>跟踪当前已遍历的长度，正常情况下保证子节点不空，并且下一个字符匹配即可；但如果遇到<code>.</code>时，由于这个字符能匹配任何字符，因此需要检查所有但非空子节点，判断之后是否能匹配。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>WordDictionary</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>public</span><span> </span><span>class</span><span><span> </span><span>TrieNode</span><span> </span></span><span>{</span></div></div><div><div><div>4</div></div><div><span>        </span><span>public</span><span> </span><span>TrieNode</span><span><span>()</span><span> </span><span>{}</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>TrieNode</span><span>[] children </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span>[</span><span>26</span><span><span>]</span><span>;</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>boolean</span><span> isEnd </span><span><span>=</span><span> </span></span><span>false</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>public</span><span> </span><span>boolean</span><span> </span><span>match</span><span>(</span><span>String</span><span><span> </span><span>word</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span>            </span><span>if</span><span><span> (index </span><span>==</span><span> </span></span><span>word</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>10</div></div><div><span>                </span><span>return</span><span> isEnd;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>// check all not-null children</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span> (</span><span>word</span><span>.</span><span>charAt</span><span><span>(index) </span><span>==</span><span> </span></span><span>'.'</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span> ; i </span><span>&lt;</span><span> </span></span><span>26</span><span>; i++) {</span></div></div><div><div><div>16</div></div><div><span>                    </span><span>if</span><span><span> (children[i] </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> children[i].</span></span><span>match</span><span><span>(word, index </span><span>+</span><span> </span></span><span>1</span><span>)) {</span></div></div><div><div><div>17</div></div><div><span>                        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>23</div></div><div><span>                </span><span>return</span><span> children[</span><span>word</span><span>.</span><span>charAt</span><span><span>(index) </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> children[</span></span><span>word</span><span>.</span><span>charAt</span><span><span>(index) </span><span>-</span><span> </span></span><span>'a'</span><span>].</span><span>match</span><span><span>(word, index </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>    </span><span>private</span><span> </span><span>TrieNode</span><span> root </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span><span>()</span><span>;</span></span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>31</div></div><div><span>    </span><span>public</span><span> </span><span>WordDictionary</span><span><span>()</span><span> </span><span>{}</span></span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>/** Adds a word into the data structure. */</span></div></div><div><div><div>34</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>addWord</span><span>(</span><span>String</span><span><span> </span><span>word</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>35</div></div><div><span>        </span><span>TrieNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> root;</span></span></div></div><div><div><div>36</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>word</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>37</div></div><div><span>            </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>38</div></div><div><span>                </span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span>();</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span>];</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>        </span><span>cur</span><span>.</span><span>isEnd</span><span><span> </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span><span>    </span></span><span>/** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */</span></div></div><div><div><div>48</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>search</span><span>(</span><span>String</span><span><span> </span><span>word</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>49</div></div><div><span>        </span><span>return</span><span> </span><span>root</span><span>.</span><span>match</span><span>(word, </span><span>0</span><span>);</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>212. Word Search II<a href="#212-word-search-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/word-search-ii/" target="_blank">https://leetcode.com/problems/word-search-ii/</a></p><hr /><p>构造Prefix Tree，将输入的<code>words</code>中每一个单词存入每个TrieNode中，注意完成输入后，在最后一个字母的节点处将<code>word</code>属性设为当前单词；再使用DFS，如果遍历的过程中遇到某个TrieNode中的单词不为空，说明已经遍历了一个完整的单词，将其添加到结果中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>class</span><span><span> </span><span>TrieNode</span><span> </span></span><span>{</span></div></div><div><div><div>3</div></div><div><span>        </span><span>TrieNode</span><span>[] children </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span>[</span><span>26</span><span><span>]</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>String</span><span> word</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>    </span><span>public</span><span> </span><span>TrieNode</span><span> </span><span>buildTrie</span><span>(</span><span>String</span><span><span>[] </span><span>words</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>TrieNode</span><span><span> </span><span>root</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span>();</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>word</span><span> </span></span><span>:</span><span> words) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>TrieNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> root;</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>word</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>                    </span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span>();</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span>];</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>// only set cur.word when finishing inserting a word</span></div></div><div><div><div>20</div></div><div><span>            </span><span>cur</span><span>.</span><span>word</span><span><span> </span><span>=</span><span> word;</span></span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> root;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>findWords</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>, </span></span><span>String</span><span><span>[] </span><span>words</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>28</div></div><div><span>        </span><span>TrieNode</span><span><span> </span><span>root</span><span> </span></span><span><span>=</span><span> </span></span><span>buildTrie</span><span>(words);</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>board</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>31</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> board[</span></span><span>0</span><span>].</span><span>length</span><span>; j++) {</span></div></div><div><div><div>32</div></div><div><span>                </span><span>dfs</span><span>(board, i, j, root, result);</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>, </span></span><span>TrieNode</span><span><span> </span><span>cur</span><span>, </span></span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>40</div></div><div><span>        </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> board[i][j];</span></span></div></div><div><div><div>41</div></div><div><span>        </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'#'</span><span><span> </span><span>||</span><span> </span></span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>42</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>43</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>children</span><span><span>[c </span><span>-</span><span> </span></span><span>'a'</span><span>];</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>        </span><span>// end of current word</span></div></div><div><div><div>47</div></div><div><span>        </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>word</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>48</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>cur</span><span>.</span><span>word</span><span>);</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>            </span><span>// avoid repeat searching</span></div></div><div><div><div>51</div></div><div><span>            </span><span>cur</span><span>.</span><span>word</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>52</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span>        </span><span>// temporarily mark visited character</span></div></div><div><div><div>55</div></div><div><span><span>        </span></span><span>board[i][j] </span><span>=</span><span> </span><span>'#'</span><span>;</span></div></div><div><div><div>56</div></div><div>
</div></div><div><div><div>57</div></div><div><span>        </span><span>// try four adjacent grids</span></div></div><div><div><div>58</div></div><div><span>        </span><span>if</span><span><span> (i </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>59</div></div><div><span>            </span><span>dfs</span><span><span>(board, i </span><span>-</span><span> </span></span><span>1</span><span>, j, cur, result);</span></div></div><div><div><div>60</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>61</div></div><div><span>        </span><span>if</span><span><span> (j </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>62</div></div><div><span>            </span><span>dfs</span><span><span>(board, i, j </span><span>-</span><span> </span></span><span>1</span><span>, cur, result);</span></div></div><div><div><div>63</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>64</div></div><div><span>        </span><span>if</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>board</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>65</div></div><div><span>            </span><span>dfs</span><span><span>(board, i </span><span>+</span><span> </span></span><span>1</span><span>, j, cur, result);</span></div></div><div><div><div>66</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>67</div></div><div><span>        </span><span>if</span><span><span> (j </span><span>&lt;</span><span> board[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>68</div></div><div><span>            </span><span>dfs</span><span><span>(board, i, j </span><span>+</span><span> </span></span><span>1</span><span>, cur, result);</span></div></div><div><div><div>69</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>70</div></div><div>
</div></div><div><div><div>71</div></div><div><span><span>        </span></span><span>board[i][j] </span><span>=</span><span> c;</span></div></div><div><div><div>72</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>73</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>213. House Robber II<a href="#213-house-robber-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/house-robber-ii/" target="_blank">https://leetcode.com/problems/house-robber-ii/</a></p><hr /><p>为了避免圆环交接处相邻两户民居报警，只能重新划定范围，相当于沿用House Robber I的思路，进行比较：一次抢<code>[0, nums.length - 2]</code>的范围，另一次抢<code>[1, nums.length - 1]</code>的范围，选取收益大的那一次。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>helper</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>low</span><span>, </span></span><span>int</span><span><span> </span><span>high</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>        </span><span>// prev2: max profit without current number's prior number</span></div></div><div><div><div>5</div></div><div><span>        </span><span>// prev: max profit between (1. without current number 2. prev2 + current number)</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>prev2</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, prev </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> low; i </span><span>&lt;=</span><span> high; i++) {</span></span></div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> prev;</span></span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>prev </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(prev, prev2 </span><span>+</span><span> nums[i]);</span></span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>prev2 </span><span>=</span><span> temp;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> prev;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>rob</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> nums[</span><span>0</span><span>];</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(</span><span>helper</span><span>(nums, </span><span>0</span><span>, </span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>2</span><span>), </span><span>helper</span><span>(nums, </span><span>1</span><span>, </span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>));</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>214. Shortest Palindrome<a href="#214-shortest-palindrome"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/shortest-palindrome/" target="_blank">https://leetcode.com/problems/shortest-palindrome/</a></p><hr /><p>显然，最直接的考虑是直接在<code>s</code>前添加<code>s</code>的逆，这样一定能得到回文串。但由于题目要求是最短但回文串，因此需要考虑的是，如何删减去粗浅思路的中间部分。换言之，如何找出中间的一部分“公共字符串”，能够用来构造回文串。例如，如果输入为<code>s = aabba</code>，则<code>aa</code>就是公共字符串：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>原始构造：abbaa aabba</span></div></div><div><div><div>2</div></div><div><span>优化后构造： abb aa bba</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>为了寻找中间的字符串，使用两个指针分别从<code>s</code>的头尾开始遍历。如果头尾指针指向的字符相等，则头指针向后移动一位；而尾指针每一次循环都向前移动一位。这一过程中两个指针必然相遇，因此头指针至少会移动一次。在这种情况下，便能够根据头指针的位置，将<code>s</code>分成两个部分，其中一部分是后缀，另一部分进一步需要处理成为公共字符串，构成的公式是：后缀的倒序 + 待处理公共字符串 + 后缀。当然，倘若头指针直接移动到了<code>s</code>末尾，说明<code>s</code>已经是一个回文串了。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>shortestPalindrome</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> s;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// try to divide the string into two parts, using head</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>head</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>tail</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span><span>; tail </span><span>&gt;=</span><span> </span></span><span>0</span><span>; tail--) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(head) </span><span>==</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span>(tail)) {</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>head++;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// already a palindrome</span></div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>return</span><span> s;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>String</span><span><span> </span><span>suffix</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>substring</span><span>(head);</span></div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> </span><span>new</span><span> </span><span>StringBuilder</span><span>(suffix).</span><span>reverse</span><span>().</span><span>toString</span><span><span>() </span><span>+</span><span> </span></span><span>shortestPalindrome</span><span>(</span><span>s</span><span>.</span><span>substring</span><span>(</span><span>0</span><span><span>, head)) </span><span>+</span><span> suffix;</span></span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>215. Kth Largest Element in an Array<a href="#215-kth-largest-element-in-an-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/kth-largest-element-in-an-array/" target="_blank">https://leetcode.com/problems/kth-largest-element-in-an-array/</a></p><hr /><p>使用快速选择算法，利用<code>pivot</code>元素为轴，交换双指针对应的数<code>nums[left]</code>和<code>nums[right]</code>，小于<code>pivot</code>的数放在<code>pivot</code>左侧，大于<code>pivot</code>的数放右侧。时间复杂度为<code>O(n)</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findKthLargest</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// kth largest is equal to (nums.length - k)th smallest</span></div></div><div><div><div>8</div></div><div><span>        </span><span>return</span><span> </span><span>quickSelect</span><span>(nums, </span><span>0</span><span>, </span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>, </span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> k);</span></span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span>// quick select: kth smallest</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>quickSelect</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>begin</span><span>, </span></span><span>int</span><span><span> </span><span>end</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (begin </span><span>==</span><span> end) {</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> nums[begin];</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span><span> (begin </span><span>&gt;</span><span> end) {</span></span></div></div><div><div><div>17</div></div><div><span>            </span><span>return</span><span> </span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>int</span><span><span> </span><span>pivot</span><span> </span></span><span><span>=</span><span> nums[begin </span><span>+</span><span> (end </span><span>-</span><span> begin) </span><span>/</span><span> </span></span><span>2</span><span>];</span></div></div><div><div><div>21</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> begin;</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>int</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> end;</span></span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>25</div></div><div><span>            </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right </span><span>&amp;&amp;</span><span> nums[left] </span><span>&lt;</span><span> pivot) {</span></span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>left++;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>            </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right </span><span>&amp;&amp;</span><span> nums[right] </span><span>&gt;</span><span> pivot) {</span></span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>right--;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>            </span><span>if</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>33</div></div><div><span>                </span><span>swap</span><span>(nums, left, right);</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>left++;</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>right--;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>if</span><span><span> (right </span><span>&gt;=</span><span> k </span><span>&amp;&amp;</span><span> right </span><span>&gt;=</span><span> begin) {</span></span></div></div><div><div><div>40</div></div><div><span>            </span><span>return</span><span> </span><span>quickSelect</span><span>(nums, begin, right, k);</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (left </span><span>&lt;=</span><span> k </span><span>&amp;&amp;</span><span> left </span><span>&lt;=</span><span> end) {</span></span></div></div><div><div><div>42</div></div><div><span>            </span><span>return</span><span> </span><span>quickSelect</span><span>(nums, left, end, k);</span></div></div><div><div><div>43</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>44</div></div><div><span>            </span><span>return</span><span> nums[k];</span></div></div><div><div><div>45</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>swap</span><span>(</span><span>int</span><span><span>[] </span><span>A</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>49</div></div><div><span>        </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> </span></span><span>A</span><span>[i];</span></div></div><div><div><div>50</div></div><div><span>        </span><span>A</span><span><span>[i] </span><span>=</span><span> </span></span><span>A</span><span>[j];</span></div></div><div><div><div>51</div></div><div><span>        </span><span>A</span><span><span>[j] </span><span>=</span><span> temp;</span></span></div></div><div><div><div>52</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>216. Combination Sum III<a href="#216-combination-sum-iii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/combination-sum-iii/" target="_blank">https://leetcode.com/problems/combination-sum-iii/</a></p><hr /><p>套用此前总结的回溯问题模版即可，注意迭代时的变量含义。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>combinationSum3</span><span>(</span><span>int</span><span><span> </span><span>k</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt; </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; &gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>backtrack</span><span>(result, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(), k, n, </span><span>1</span><span>);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>List</span><span>&lt; </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; &gt; </span><span>result</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>temp</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span> </span><span>start</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span>        </span><span>if</span><span> (</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>==</span><span> k </span><span>&amp;&amp;</span><span> n </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(temp));</span></div></div><div><div><div>11</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> start; i </span><span>&lt;=</span><span> </span></span><span>9</span><span>; i++) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>temp</span><span>.</span><span>add</span><span>(i);</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>// need k numbers; remain sum is n - i; starting index is i + 1</span></div></div><div><div><div>18</div></div><div><span>            </span><span>backtrack</span><span><span>(result, temp, k, n </span><span>-</span><span> i, i </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>19</div></div><div><span>            </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>217. Contains Duplicate<a href="#217-contains-duplicate"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/contains-duplicate/" target="_blank">https://leetcode.com/problems/contains-duplicate/</a></p><hr /><p>向HashSet中添加元素，重复的数字无法被添加。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>containsDuplicate</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>set</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>Integer</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>set</span><span>.</span><span>add</span><span>(num)) {</span></div></div><div><div><div>10</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>218. The Skyline Problem<a href="#218-the-skyline-problem"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/the-skyline-problem/" target="_blank">https://leetcode.com/problems/the-skyline-problem/</a></p><hr /><p>把所有楼房的坐标与高度信息提取出来并排序，排序时按照先坐标（从左到右）后高度（从低到高）的顺序进行排列。注意提取时，可以将left edge的高度取个负数处理，这样做的目的是更好区分出left edge和right edge，方便之后的计算。</p><p>完成排序后，利用TreeMap的自动排序特性，以楼房高度为key，具有这个高度的楼房数量为value，把刚才提取出来的信息整理到TreeMap中。分情况讨论：</p><ul>
<li>如果高度是负数，说明提取到的是left edge，意味着遇到了一栋新楼，直接把信息存进TreeMap中</li>
<li>如果高度为正，并且这个高度在TreeMap中的value是1，说明当前只有一栋楼是这个高度，并且此时我们已经遇到了其右边界。因此，我们需要把这个高度key移出TreeMap，这样子之后的轮廓打印中才能够正确打印出第二高的楼房高度</li>
<li>如果高度为正，并且这个高度在TreeMap中的value不止是1，说明不止一栋楼是这个高度，我们只是遇到了其中一栋楼的右边界，仍然还有其他的楼是这个高度。因此我们只需要修改TreeMap中这个高度key对应的value即可</li>
</ul><p>完成TreeMap处理后，获取到TreeMap的最后一个key，也就是当前能被看到的最高的高度。这个高度与其对应的坐标点就是城市天际线中的轮廓点之一。需要注意，只有这一轮key发生了改变，才需要输出（不变的key意味着轮廓重合，不需要被打印出来）。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>getSkyline</span><span>(</span><span>int</span><span><span>[][] </span><span>buildings</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>int</span><span><span>[]&gt; </span><span>height</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>();</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>b</span><span> </span></span><span>:</span><span> buildings) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>height</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>int</span><span>[]{b[</span><span>0</span><span><span>], </span><span>-</span><span>b[</span></span><span>2</span><span>]});</span></div></div><div><div><div>8</div></div><div><span>            </span><span>height</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>int</span><span>[]{b[</span><span>1</span><span>], b[</span><span>2</span><span>]});</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>// first sort by x coordinate, then sort by height</span></div></div><div><div><div>12</div></div><div><span>        </span><span>Collections</span><span>.</span><span>sort</span><span>(height, (a, b) </span><span>-&gt;</span><span> a[</span><span>0</span><span><span>] </span><span>==</span><span> b[</span></span><span>0</span><span>] </span><span>?</span><span> a[</span><span>1</span><span><span>] </span><span>-</span><span> b[</span></span><span>1</span><span>] </span><span>:</span><span> a[</span><span>0</span><span><span>] </span><span>-</span><span> b[</span></span><span>0</span><span>]);</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>// &lt;height, num&gt;</span></div></div><div><div><div>15</div></div><div><span>        </span><span>TreeMap</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>bst</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeMap</span><span>();</span></div></div><div><div><div>16</div></div><div><span>        </span><span>bst</span><span>.</span><span>put</span><span>(</span><span>0</span><span>, </span><span>1</span><span>);</span></div></div><div><div><div>17</div></div><div><span>        </span><span>int</span><span><span> </span><span>prev</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>h</span><span> </span></span><span>:</span><span> height) {</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>if</span><span> (h[</span><span>1</span><span><span>] </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>22</div></div><div><span>                </span><span>// a new building is incoming</span></div></div><div><div><div>23</div></div><div><span>                </span><span>bst</span><span>.</span><span>put</span><span><span>(</span><span>-</span><span>h[</span></span><span>1</span><span>], </span><span>bst</span><span>.</span><span>getOrDefault</span><span><span>(</span><span>-</span><span>h[</span></span><span>1</span><span>], </span><span>0</span><span><span>) </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>bst</span><span>.</span><span>get</span><span>(h[</span><span>1</span><span><span>]) </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>                </span><span>// current highest building reaches end, should output second highest building later</span></div></div><div><div><div>26</div></div><div><span>                </span><span>bst</span><span>.</span><span>remove</span><span>(h[</span><span>1</span><span>]);</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>28</div></div><div><span>                </span><span>bst</span><span>.</span><span>put</span><span>(h[</span><span>1</span><span>], </span><span>bst</span><span>.</span><span>get</span><span>(h[</span><span>1</span><span><span>]) </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>            </span><span>// output highest new building</span></div></div><div><div><div>32</div></div><div><span>            </span><span>int</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>bst</span><span>.</span><span>lastKey</span><span>();</span></div></div><div><div><div>33</div></div><div><span>            </span><span>if</span><span><span> (cur </span><span>!=</span><span> prev) {</span></span></div></div><div><div><div>34</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>(</span><span>Arrays</span><span>.</span><span>asList</span><span>(h[</span><span>0</span><span>], cur)));</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>prev </span><span>=</span><span> cur;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>219. Contains Duplicate II<a href="#219-contains-duplicate-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/contains-duplicate-ii/" target="_blank">https://leetcode.com/problems/contains-duplicate-ii/</a></p><hr /><p>用一个HashMap存储当前数<code>nums[i]</code>和下标<code>i</code>。利用<code>HashMap.put()</code>方法的返回值，判断遇到相同<code>nums[i]</code>时下标之差为多少。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>containsNearbyDuplicate</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>// if not present, new entry, else the old entry will be updated</span></div></div><div><div><div>7</div></div><div><span>            </span><span>Integer</span><span><span> </span><span>idx</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>put</span><span>(nums[i], i);</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>            </span><span>if</span><span><span> (idx </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(idx </span><span>-</span><span> i) </span><span>&lt;=</span><span> k) {</span></span></div></div><div><div><div>10</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>220. Contains Duplicate III<a href="#220-contains-duplicate-iii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/contains-duplicate-iii/" target="_blank">https://leetcode.com/problems/contains-duplicate-iii/</a></p><hr /><p>由于题目提示问题可以在<code>O(nlogk)</code>的时间复杂度内解决，因此想到了二叉搜索树，而结合二叉搜索树与去重复性特点的数据结构正好是TreeSet。</p><p>构造一个TreeSet，利用两个TreeSet的函数<code>floor()</code>和<code>ceiling()</code>分别找出小于等于当前<code>num</code>的最大元素与集合中大于等于当前<code>num</code>的最小元素，以此便能判断差值是否在范围内。同时，注意到题目限定了常数<code>k</code>作为判定范围，实际上便是提示维持一个长度为<code>k</code>的窗口大小用于判断内部的重复性，因此循环次数超过<code>k</code>时，要将向前<code>k</code>个位置的元素从TreeSet中删除。</p><p>最后，题目中可能出现整数溢出，因此应该将TreeSet初始化为Long格式。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>containsNearbyAlmostDuplicate</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>, </span></span><span>int</span><span><span> </span><span>t</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&lt;</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>TreeSet</span><span>&lt;</span><span>Long</span><span><span>&gt; </span><span>set</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeSet</span><span>&lt;&gt;();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>long</span><span><span> </span><span>num</span><span> </span></span><span><span>=</span><span> (</span></span><span>long</span><span>)nums[i];</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>            </span><span>// get upper bound and lower bound of current num</span></div></div><div><div><div>12</div></div><div><span>            </span><span>// find if there is any element in this range</span></div></div><div><div><div>13</div></div><div><span>            </span><span>Long</span><span><span> </span><span>floor</span><span> </span></span><span><span>=</span><span> </span></span><span>set</span><span>.</span><span>floor</span><span><span>(num), ceiling </span><span>=</span><span> </span></span><span>set</span><span>.</span><span>ceiling</span><span>(num);</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span><span> ((floor </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> num </span><span>-</span><span> floor </span><span>&lt;=</span><span> t) </span><span>||</span><span> (ceiling </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> ceiling </span><span>-</span><span> num </span><span>&lt;=</span><span> t)) {</span></span></div></div><div><div><div>15</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>            </span><span>// add current num to set</span></div></div><div><div><div>19</div></div><div><span>            </span><span>set</span><span>.</span><span>add</span><span>(num);</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>// delete k-th number backward</span></div></div><div><div><div>22</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>&gt;=</span><span> k) {</span></span></div></div><div><div><div>23</div></div><div><span>                </span><span>set</span><span>.</span><span>remove</span><span>((</span><span>long</span><span><span>)nums[i </span><span>-</span><span> k]);</span></span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>221. Maximal Square<a href="#221-maximal-square"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/maximal-square/" target="_blank">https://leetcode.com/problems/maximal-square/</a></p><hr /><p>使用动态规划，<code>dp[i][j</code>]代表在以<code>[i, j]</code>这一格为右下角的正方形边长。若这一格的值为1，那这个正方形的边长就是他的上，左，斜上的最小值边长+1，因为任何一边短缺都构成不了正方形。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maximalSquare</span><span>(</span><span>char</span><span><span>[][] </span><span>matrix</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (matrix </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span>, col </span><span>=</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[row </span><span>+</span><span> </span></span><span>1</span><span><span>][col </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> row; i++) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;=</span><span> col; j++) {</span></span></div></div><div><div><div>13</div></div><div><span>                </span><span>if</span><span><span> (matrix[i</span><span>-</span></span><span>1</span><span><span>][j</span><span>-</span></span><span>1</span><span><span>] </span><span>==</span><span> </span></span><span>'1'</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>                    </span><span>// minimum of up, left, upper left grids</span></div></div><div><div><div>15</div></div><div><span><span>                    </span></span><span>dp[i][j] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(</span><span>Math</span><span>.</span><span>min</span><span><span>(dp[i</span><span>-</span></span><span>1</span><span><span>][j</span><span>-</span></span><span>1</span><span><span>], dp[i</span><span>-</span></span><span>1</span><span><span>][j]), dp[i][j</span><span>-</span></span><span>1</span><span><span>]) </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>                    </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(dp[i][j], result);</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span><span> result </span><span>*</span><span> result;</span></span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>222. Count Complete Tree Nodes<a href="#222-count-complete-tree-nodes"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/count-complete-tree-nodes/" target="_blank">https://leetcode.com/problems/count-complete-tree-nodes/</a></p><hr /><p>对于每一个节点：</p><ul>
<li>计算左子树的高度</li>
<li>计算右子树的高度</li>
<li>左右相同，直接利用完全二叉树的特性算出答案</li>
<li>左右不同，递归至下一层继续计算子节点的左右子树深度。注意最后+1（自身节点的数量）</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>countNodes</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span> </span><span>leftDepth</span><span> </span></span><span><span>=</span><span> </span></span><span>getLeftDepth</span><span>(root);</span></div></div><div><div><div>19</div></div><div><span>        </span><span>int</span><span><span> </span><span>rightDepth</span><span> </span></span><span><span>=</span><span> </span></span><span>getRightDepth</span><span>(root);</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>if</span><span><span> (leftDepth </span><span>==</span><span> rightDepth) {</span></span></div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span> (</span><span>1</span><span><span> </span><span>&lt;&lt;</span><span> leftDepth) </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> </span><span>1</span><span><span> </span><span>+</span><span> </span></span><span>countNodes</span><span>(</span><span>root</span><span>.</span><span>left</span><span><span>) </span><span>+</span><span> </span></span><span>countNodes</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>getLeftDepth</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>29</div></div><div><span>        </span><span>int</span><span><span> </span><span>depth</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>30</div></div><div><span>        </span><span>while</span><span><span> (node </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>node </span><span>=</span><span> </span><span>node</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>depth++;</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>        </span><span>return</span><span> depth;</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>getRightDepth</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>38</div></div><div><span>        </span><span>int</span><span><span> </span><span>depth</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>39</div></div><div><span>        </span><span>while</span><span><span> (node </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>node </span><span>=</span><span> </span><span>node</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>depth++;</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span>        </span><span>return</span><span> depth;</span></div></div><div><div><div>44</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>223. Rectangle Area<a href="#223-rectangle-area"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/rectangle-area/" target="_blank">https://leetcode.com/problems/rectangle-area/</a></p><hr /><p>核心在于求出重叠部分的面积。要出现重叠，两矩形左边的最大值一定会小于右边的最小值；同理，下边的最大值会小于上边的最小值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>computeArea</span><span>(</span><span>int</span><span><span> </span><span>ax1</span><span>, </span></span><span>int</span><span><span> </span><span>ay1</span><span>, </span></span><span>int</span><span><span> </span><span>ax2</span><span>, </span></span><span>int</span><span><span> </span><span>ay2</span><span>, </span></span><span>int</span><span><span> </span><span>bx1</span><span>, </span></span><span>int</span><span><span> </span><span>by1</span><span>, </span></span><span>int</span><span><span> </span><span>bx2</span><span>, </span></span><span>int</span><span><span> </span><span>by2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (bx1 </span><span>&gt;</span><span> ax2 </span><span>||</span><span> bx2 </span><span>&lt;</span><span> ax1) {</span></span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span><span> (ax2 </span><span>-</span><span> ax1) </span><span>*</span><span> (ay2 </span><span>-</span><span> ay1) </span><span>+</span><span> (bx2 </span><span>-</span><span> bx1) </span><span>*</span><span> (by2 </span><span>-</span><span> by1);</span></span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(ax1, bx1);</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span>(ax2, bx2);</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>bottom</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(ay1, by1);</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>top</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span>(ay2, by2);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span> </span><span>overlap</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (right </span><span>&gt;</span><span> left </span><span>&amp;&amp;</span><span> top </span><span>&gt;</span><span> bottom) {</span></span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>overlap </span><span>=</span><span> (right </span><span>-</span><span> left) </span><span>*</span><span> (top </span><span>-</span><span> bottom);</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span><span> (ax2 </span><span>-</span><span> ax1) </span><span>*</span><span> (ay2 </span><span>-</span><span> ay1) </span><span>+</span><span> (bx2 </span><span>-</span><span> bx1) </span><span>*</span><span> (by2 </span><span>-</span><span> by1) </span><span>-</span><span> overlap;</span></span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>224. Basic Calculator<a href="#224-basic-calculator"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/basic-calculator/" target="_blank">https://leetcode.com/problems/basic-calculator/</a></p><hr /><p>使用栈，遇到数字修改<code>num</code>；遇到加减号将数字累计到结果中，并修改符号；遇到左括号把当前符号数弹入栈；遇到右括号则弹出栈顶符号数。得到最终结果前，需要将栈中的<code>num</code>取出，结合对应的符号累加。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>calculate</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>stack</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, sign </span><span>=</span><span> </span></span><span>1</span><span><span>, num </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>stack</span><span>.</span><span>push</span><span>(sign);</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span><span> (c </span><span>&gt;=</span><span> </span></span><span>'0'</span><span><span> </span><span>&amp;&amp;</span><span> c </span><span>&lt;=</span><span> </span></span><span>'9'</span><span>) {</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>num </span><span>=</span><span> num </span><span>*</span><span> </span><span>10</span><span><span> </span><span>+</span><span> c </span><span>-</span><span> </span></span><span>'0'</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'+'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'-'</span><span>) {</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> sign </span><span>*</span><span> num;</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>sign </span><span>=</span><span> </span><span>stack</span><span>.</span><span>peek</span><span><span>() </span><span>*</span><span> (c </span><span>==</span><span> </span></span><span>'+'</span><span> </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span><span> </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>num </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'('</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>                </span><span>stack</span><span>.</span><span>push</span><span>(sign);</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>')'</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>                </span><span>stack</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>result </span><span>+=</span><span> sign </span><span>*</span><span> num;</span></div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>225. Implement Stack using Queues<a href="#225-implement-stack-using-queues"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/implement-stack-using-queues/" target="_blank">https://leetcode.com/problems/implement-stack-using-queues/</a></p><hr /><p>队列实现栈时，主要关注<code>push()</code>。Queue添加元素默认添加在尾部，但可以将前面的元素全部逐个弹出再逐个加入到末尾，形成一种循环机制，以此达到“添加在头部”的效果。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>MyStack</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>Queue</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> queue </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayDeque</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>MyStack</span><span><span>()</span><span> </span><span>{}</span></span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>/** Push element x onto stack. */</span></div></div><div><div><div>9</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>push</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>queue</span><span>.</span><span>offer</span><span>(x);</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>queue</span><span>.</span><span>size</span><span>(); i++) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>queue</span><span>.</span><span>offer</span><span>(</span><span>queue</span><span>.</span><span>poll</span><span>());</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>/** Removes the element on top of the stack and returns that element. */</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>pop</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> </span><span>queue</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>/** Get the top element. */</span></div></div><div><div><div>22</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>top</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> </span><span>queue</span><span>.</span><span>peek</span><span>();</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>/** Returns whether the stack is empty. */</span></div></div><div><div><div>27</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>empty</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> </span><span>queue</span><span>.</span><span>isEmpty</span><span>();</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>226. Invert Binary Tree<a href="#226-invert-binary-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/invert-binary-tree/" target="_blank">https://leetcode.com/problems/invert-binary-tree/</a></p><hr /><p>对于当前节点，左子树递归调用右支作为参数的<code>invertTree()</code>，右子树调用左支作为参数的<code>invertTree()</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>invertTree</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>root</span><span>.</span><span>left</span><span><span>, right </span><span>=</span><span> </span></span><span>root</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>23</div></div><div><span>        </span><span>root</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>invertTree</span><span>(right);</span></div></div><div><div><div>24</div></div><div><span>        </span><span>root</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>invertTree</span><span>(left);</span></div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> root;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>227. Basic Calculator II<a href="#227-basic-calculator-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/basic-calculator-ii/" target="_blank">https://leetcode.com/problems/basic-calculator-ii/</a></p><hr /><p>仍然使用栈，但与Basic Calculator不同，此次不需要考虑正负号，因此直接根据相应的运算符号处理栈即可。</p><p>需要注意，遇到空格时直接跳过；在处理完栈之后，要及时更新符号<code>op</code>和操作数<code>num</code>。此外，为了不遗漏算式中的最后一个数，可以使用一个技巧，即在原始的字符串后加一个<code>+</code>号，这样使得最后一个数也能被推入栈中。最后累加栈中的所有数即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>calculate</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>stack</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;&gt;();</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// ensure that the last number can be pushed into the stack</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>s </span><span>+=</span><span> </span><span>'+'</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// operand</span></div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span> </span><span>num</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// operator</span></div></div><div><div><div>16</div></div><div><span>        </span><span>char</span><span><span> </span><span>op</span><span> </span></span><span><span>=</span><span> </span></span><span>'+'</span><span>;</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>if</span><span><span> (c </span><span>&gt;=</span><span> </span></span><span>'0'</span><span><span> </span><span>&amp;&amp;</span><span> c </span><span>&lt;=</span><span> </span></span><span>'9'</span><span>) {</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>num </span><span>=</span><span> num </span><span>*</span><span> </span><span>10</span><span><span> </span><span>+</span><span> c </span><span>-</span><span> </span></span><span>'0'</span><span>;</span></div></div><div><div><div>23</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>            </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>' '</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>if</span><span><span> (op </span><span>==</span><span> </span></span><span>'+'</span><span>) {</span></div></div><div><div><div>31</div></div><div><span>                </span><span>stack</span><span>.</span><span>push</span><span>(num);</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>            </span><span>if</span><span><span> (op </span><span>==</span><span> </span></span><span>'-'</span><span>) {</span></div></div><div><div><div>34</div></div><div><span>                </span><span>stack</span><span>.</span><span>push</span><span><span>(</span><span>-</span><span>num);</span></span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>            </span><span>if</span><span><span> (op </span><span>==</span><span> </span></span><span>'*'</span><span>) {</span></div></div><div><div><div>37</div></div><div><span>                </span><span>stack</span><span>.</span><span>push</span><span>(</span><span>stack</span><span>.</span><span>pop</span><span><span>() </span><span>*</span><span> num);</span></span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>            </span><span>if</span><span><span> (op </span><span>==</span><span> </span></span><span>'/'</span><span>) {</span></div></div><div><div><div>40</div></div><div><span>                </span><span>stack</span><span>.</span><span>push</span><span>(</span><span>stack</span><span>.</span><span>pop</span><span><span>() </span><span>/</span><span> num);</span></span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>op </span><span>=</span><span> c;</span></div></div><div><div><div>44</div></div><div><span><span>            </span></span><span>num </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>48</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>stack</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> </span><span>stack</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>53</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>228. Summary Ranges<a href="#228-summary-ranges"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/summary-ranges/" target="_blank">https://leetcode.com/problems/summary-ranges/</a></p><hr /><p>遍历数组，先记录当前的页码，之后向后搜索尽可能长的连续页码，直到下标无法继续移动为止。如果移动后下标指向的页码与当前页码不同，说明存在着连续页码；反之说明是单页。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>summaryRanges</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(nums[</span><span>0</span><span><span>] </span><span>+</span><span> </span></span><span>""</span><span>);</span></div></div><div><div><div>10</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> nums[i];</span></span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>// continuous pages</span></div></div><div><div><div>17</div></div><div><span>            </span><span>while</span><span><span> (i </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> (nums[i</span><span>+</span></span><span>1</span><span><span>] </span><span>-</span><span> nums[i] </span><span>==</span><span> </span></span><span>1</span><span>)) {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>if</span><span><span> (temp </span><span>!=</span><span> nums[i]) {</span></span></div></div><div><div><div>22</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span><span>(temp </span><span>+</span><span> </span></span><span>"-&gt;"</span><span><span> </span><span>+</span><span> nums[i]);</span></span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>24</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span><span>(temp </span><span>+</span><span> </span></span><span>""</span><span>);</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>229. Majority Element II<a href="#229-majority-element-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/majority-element-ii/" target="_blank">https://leetcode.com/problems/majority-element-ii/</a></p><hr /><p>与Majority Element II思想近似，仍旧采用投票表决的思想。由于题目要求选出超过出现<code>⌊ n/3 ⌋</code>次的数，因此这样的数最多有两个，设定为<code>candidate1</code>和<code>candidate2</code>。</p><p>遍历数组时，遇到当前选出的<code>candidate1</code>和<code>candidate2</code>则次数+1；否则，次数各自-1（相当于当前数成对抵消了<code>candidate1</code>和<code>candidate2</code>）。如果原来的数次数都为0，且遇到了新的数，则<code>candidate1</code>或<code>candidate2</code>更换。第一次遍历数组后，可以最终投票表决出符合条件的数具体是多少，第二次遍历就只需统计这些数具体出现了几次。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>majorityElement</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>count1</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, count2 </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Integer</span><span><span> </span><span>candidate1</span><span> </span></span><span><span>=</span><span> </span></span><span>null</span><span><span>, candidate2 </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>if</span><span><span> (candidate1 </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> candidate1 </span><span>==</span><span> num) {</span></span></div></div><div><div><div>7</div></div><div><span><span>                </span></span><span>count1++;</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (candidate2 </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> candidate2 </span><span>==</span><span> num) {</span></span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>count2++;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (count1 </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>                </span><span>// candidate1 has been updated</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>candidate1 </span><span>=</span><span> num;</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>count1++;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (count2 </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>// candidate2 has been updated</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>candidate2 </span><span>=</span><span> num;</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>count2++;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>// reduce the portion of candidate1 and candidate2</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>count1--;</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>count2--;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>count1 </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>count2 </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>27</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>28</div></div><div><span>            </span><span>if</span><span><span> (candidate1 </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> candidate1 </span><span>==</span><span> num) {</span></span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>count1++;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>            </span><span>if</span><span><span> (candidate2 </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> candidate2 </span><span>==</span><span> num) {</span></span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>count2++;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>37</div></div><div><span>        </span><span>if</span><span><span> (count1 </span><span>&gt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>/</span><span>3</span><span>) {</span></div></div><div><div><div>38</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(candidate1);</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>        </span><span>if</span><span><span> (count2 </span><span>&gt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>/</span><span>3</span><span>) {</span></div></div><div><div><div>41</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(candidate2);</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>230. Kth Smallest Element in a BST<a href="#230-kth-smallest-element-in-a-bst"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/kth-smallest-element-in-a-bst/" target="_blank">https://leetcode.com/problems/kth-smallest-element-in-a-bst/</a></p><hr /><p>沿用中序遍历思想，直接遍历至树的最左端，再逐渐向右遍历，直到次数为<code>k</code>即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> count </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>18</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> resultModified </span><span><span>=</span><span> </span></span><span>false</span><span>;</span></div></div><div><div><div>19</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> result </span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>;</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>kthSmallest</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>helper</span><span>(root, k);</span></div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>helper</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> resultModified) {</span></span></div></div><div><div><div>28</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>helper</span><span>(</span><span>node</span><span>.</span><span>left</span><span>, k);</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>count++;</span></div></div><div><div><div>34</div></div><div><span>        </span><span>if</span><span><span> (count </span><span>==</span><span> k) {</span></span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>node</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>resultModified </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>37</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>helper</span><span>(</span><span>node</span><span>.</span><span>right</span><span>, k);</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>231. Power of Two<a href="#231-power-of-two"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/power-of-two/" target="_blank">https://leetcode.com/problems/power-of-two/</a></p><hr /><p>二的次幂转换为二进制时，只有首位为1，其余都是0；利用这个特点，只需要判断<code>n</code>和<code>n-1</code>的与是否为0即可。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isPowerOfTwo</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span><span> n </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> (n </span><span>&amp;</span><span> (n </span><span>-</span><span> </span></span><span>1</span><span><span>)) </span><span>==</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>232. Implement Queue using Stacks<a href="#232-implement-queue-using-stacks"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/implement-queue-using-stacks/" target="_blank">https://leetcode.com/problems/implement-queue-using-stacks/</a></p><hr /><p>使用双栈实现队列，一进一出。大致思路是队列加入元素时统一推进入栈<code>in</code>；之后再一一弹出，进入出栈<code>out</code>，由此模拟元素先进先出的顺序。因此，查看队首元素时，将入栈的元素推入出栈，获取出栈的栈顶元素即为队首元素。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>MyQueue</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>Stack</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> in</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>Stack</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> out</span></span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>7</div></div><div><span>    </span><span>public</span><span> </span><span>MyQueue</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>in </span><span>=</span><span> </span><span>new</span><span> </span><span>Stack</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>out </span><span>=</span><span> </span><span>new</span><span> </span><span>Stack</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>/** Push element x to the back of queue. */</span></div></div><div><div><div>13</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>push</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>in</span><span>.</span><span>push</span><span>(x);</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>/** Removes the element from in front of queue and returns that element. */</span></div></div><div><div><div>18</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>pop</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>peek</span><span>();</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> </span><span>out</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>/** Get the front element. */</span></div></div><div><div><div>24</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>peek</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>// if out is empty, pop top element of in and push it into out</span></div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span> (</span><span>out</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>while</span><span><span> (</span><span>!</span></span><span>in</span><span>.</span><span>isEmpty</span><span>()) </span><span>out</span><span>.</span><span>push</span><span>(</span><span>in</span><span>.</span><span>pop</span><span>());</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span> </span><span>out</span><span>.</span><span>peek</span><span>();</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>/** Returns whether the queue is empty. */</span></div></div><div><div><div>34</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>empty</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>35</div></div><div><span>        </span><span>return</span><span> </span><span>in</span><span>.</span><span>isEmpty</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>out</span><span>.</span><span>isEmpty</span><span>();</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>如果场景升级，要求实现一个线程安全版本双栈实现队列，只需要利用Java的synchronized函数，在<code>push()</code>和<code>peek()</code>时加锁即可：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>MyQueue</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>Object</span><span> lock</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>Stack</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> in</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>Stack</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> out</span></span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>8</div></div><div><span>    </span><span>public</span><span> </span><span>MyQueue</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>lock </span><span>=</span><span> </span><span>new</span><span> </span><span>Object</span><span>();</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>in </span><span>=</span><span> </span><span>new</span><span> </span><span>Stack</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>out </span><span>=</span><span> </span><span>new</span><span> </span><span>Stack</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>/** Push element x to the back of queue. */</span></div></div><div><div><div>15</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>push</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>16</div></div><div><span>        </span><span>// must get lock to run the code inside synchronized</span></div></div><div><div><div>17</div></div><div><span>        </span><span>synchronized</span><span>(lock) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>in</span><span>.</span><span>push</span><span>(x);</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>/** Removes the element from in front of queue and returns that element. */</span></div></div><div><div><div>23</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>pop</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>peek</span><span>();</span></div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> </span><span>out</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>/** Get the front element. */</span></div></div><div><div><div>29</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>peek</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>30</div></div><div><span>        </span><span>// if out is empty, pop top element of in and push it into out</span></div></div><div><div><div>31</div></div><div><span>        </span><span>if</span><span> (</span><span>out</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>32</div></div><div><span>            </span><span>synchronized</span><span>(lock) {</span></div></div><div><div><div>33</div></div><div><span>                </span><span>while</span><span><span> (</span><span>!</span></span><span>in</span><span>.</span><span>isEmpty</span><span>()) </span><span>out</span><span>.</span><span>push</span><span>(</span><span>in</span><span>.</span><span>pop</span><span>());</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>        </span><span>return</span><span> </span><span>out</span><span>.</span><span>peek</span><span>();</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>/** Returns whether the queue is empty. */</span></div></div><div><div><div>40</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>empty</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>41</div></div><div><span>        </span><span>return</span><span> </span><span>in</span><span>.</span><span>isEmpty</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>out</span><span>.</span><span>isEmpty</span><span>();</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>233. Number of Digit One<a href="#233-number-of-digit-one"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/number-of-digit-one/" target="_blank">https://leetcode.com/problems/number-of-digit-one/</a></p><hr /><p>纯数学推理题。观察，每10个数进行排列：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>0, 1, 2, 3 ... 9 (1)</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>10, 11, 12, 13 ... 19 (1) + 10</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>20, 21, 22, 23 ... 29 (1)</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>...</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>90, 91, 92, 93 ... 99 (1)</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>100, 101, 102, 103 ... 109 (10 + 1)</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>110, 111, 112, 113 ... 119 (10 + 1) + 10</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>120, 121, 122, 123 ... 129 (10 + 1)</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>...</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>190, 191, 192, 193 ... 199 (10 + 1)</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>最基础的情况下，每10个数里一定有1个数个位为1，每100个数里一定有10个数十位为1，每1000个数里一定有100个数百位为1…因此核心思想是用10的次幂<code>k</code>作为基底进行遍历。令<code>r = n / k</code>，则以上的分析将产生1的个数：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>r / 10 * k</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>接着考虑特殊行，也就是10，11，12… 100，101，102…特殊行的特点在于十位/百位/…总有一个1。所以，采用取模的办法，令<code>m = n % k</code>，则在这一位上能够产生<code>m + 1</code>个1。即：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>r % 10 == 1 ? m + 1 : 0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>最后，某位大于等于2时，情况一致，直接添加在原始情况上即可。总和是：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>(r + 8) / 10 * k + (r % 10 == 1 ? m + 1 : 0)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>countDigitOne</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>long</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; k </span><span>&lt;=</span><span> n; k </span><span>*=</span><span> </span></span><span>10</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>long</span><span><span> </span><span>r</span><span> </span></span><span><span>=</span><span> n </span><span>/</span><span> k, m </span><span>=</span><span> n </span><span>%</span><span> k;</span></span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> (r </span><span>+</span><span> </span><span>8</span><span><span>) </span><span>/</span><span> </span></span><span>10</span><span><span> </span><span>*</span><span> k </span><span>+</span><span> (r </span><span>%</span><span> </span></span><span>10</span><span><span> </span><span>==</span><span> </span></span><span>1</span><span> </span><span>?</span><span><span> m </span><span>+</span><span> </span></span><span>1</span><span> </span><span>:</span><span> </span><span>0</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>234. Palindrome Linked List<a href="#234-palindrome-linked-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/palindrome-linked-list/" target="_blank">https://leetcode.com/problems/palindrome-linked-list/</a></p><hr /><p>使用快慢指针找到后半部分链表起点，并调转后半部分链表，再循环判断对称元素是否相等。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isPalindrome</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>fast</span><span> </span></span><span><span>=</span><span> head, slow </span><span>=</span><span> head;</span></span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>while</span><span><span> (fast </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>fast</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>slow </span><span>=</span><span> </span><span>slow</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>fast </span><span>=</span><span> </span><span>fast</span><span>.</span><span>next</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// odd length</span></div></div><div><div><div>21</div></div><div><span>        </span><span>if</span><span><span> (fast </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>slow </span><span>=</span><span> </span><span>slow</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>// reverse second half of the list</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>slow </span><span>=</span><span> </span><span>reverse</span><span>(slow);</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>fast </span><span>=</span><span> head;</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// compare two halves</span></div></div><div><div><div>30</div></div><div><span>        </span><span>while</span><span><span> (slow </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>31</div></div><div><span>            </span><span>if</span><span> (</span><span>slow</span><span>.</span><span>val</span><span><span> </span><span>!=</span><span> </span></span><span>fast</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>32</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>slow </span><span>=</span><span> </span><span>slow</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>fast </span><span>=</span><span> </span><span>fast</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>    </span><span>private</span><span> </span><span>ListNode</span><span> </span><span>reverse</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>43</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>prev</span><span> </span></span><span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>44</div></div><div><span>        </span><span>while</span><span><span> (head </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>45</div></div><div><span>            </span><span>ListNode</span><span><span> </span><span>next</span><span> </span></span><span><span>=</span><span> </span></span><span>head</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>46</div></div><div><span>            </span><span>head</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> prev;</span></span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span><span>            </span></span><span>prev </span><span>=</span><span> head;</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>head </span><span>=</span><span> next;</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span>        </span><span>return</span><span> prev;</span></div></div><div><div><div>52</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>235. Lowest Common Ancestor of a Binary Search Tree<a href="#235-lowest-common-ancestor-of-a-binary-search-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/" target="_blank">https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/</a></p><hr /><p>如果当前节点<code>root</code>的值<code>root.val</code>位于<code>[p, q]</code>内，说明<code>root</code>已经是<code>p</code>和<code>q</code>的最小公共祖先；否则，根据<code>root</code>和<code>p.val</code>与<code>q.val</code>的大小比较，调整搜索方向继续查找。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode(int x) { val = x; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>lowestCommonAncestor</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>p</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>q</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>// root.val is not between p.val and q.val</span></div></div><div><div><div>14</div></div><div><span>        </span><span>while</span><span> ((</span><span>root</span><span>.</span><span>val</span><span><span> </span><span>-</span><span> </span></span><span>p</span><span>.</span><span>val</span><span><span>) </span><span>*</span><span> (</span></span><span>root</span><span>.</span><span>val</span><span><span> </span><span>-</span><span> </span></span><span>q</span><span>.</span><span>val</span><span><span>) </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>root </span><span>=</span><span> </span><span>p</span><span>.</span><span>val</span><span><span> </span><span>&lt;</span><span> </span></span><span>root</span><span>.</span><span>val</span><span> </span><span>?</span><span> </span><span>root</span><span>.</span><span>left</span><span> </span><span>:</span><span> </span><span>root</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> root;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>236. Lowest Common Ancestor of a Binary Tree<a href="#236-lowest-common-ancestor-of-a-binary-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/" target="_blank">https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/</a></p><hr /><p>如果某一个节点的左右子树里都能找到<code>p</code>或<code>q</code>，说明当前节点就是最小的公共祖先；否则，哪一边找不到，就说明这一边没有，去另一边的子树找。当然，如果两边都没有，说明路径不对，返回<code>null</code>退回上层。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode(int x) { val = x; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>10</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>11</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>lowestCommonAncestor</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>p</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>q</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> root </span><span>==</span><span> p </span><span>||</span><span> root </span><span>==</span><span> q) {</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>return</span><span> root;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// whether can we find p or q in left &amp; right subtrees</span></div></div><div><div><div>17</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>lowestCommonAncestor</span><span>(</span><span>root</span><span>.</span><span>left</span><span>, p, q);</span></div></div><div><div><div>18</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>lowestCommonAncestor</span><span>(</span><span>root</span><span>.</span><span>right</span><span>, p, q);</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// wrong path</span></div></div><div><div><div>21</div></div><div><span>        </span><span>if</span><span><span> (left </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> right </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>// current node is LCA</span></div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span><span> (left </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> right </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>return</span><span> root;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// null in one subtree, find in the other</span></div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span><span> left </span><span>==</span><span> </span></span><span>null</span><span> </span><span>?</span><span> right </span><span>:</span><span> left;</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>237. Delete Node in a Linked List<a href="#237-delete-node-in-a-linked-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/delete-node-in-a-linked-list/" target="_blank">https://leetcode.com/problems/delete-node-in-a-linked-list/</a></p><hr /><p>由于只给了一个<code>node</code>节点的引用，因此不知道链表的头在哪里，无法真正意义上删除<code>node</code>节点，只能将<code>node</code>的下一个节点的值赋值给<code>node</code>，再跳过<code>node</code>的下一个节点，起到了删除的效果。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode(int x) { val = x; }</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>9</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>10</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>deleteNode</span><span>(</span><span>ListNode</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>11</div></div><div><span>        </span><span>node</span><span>.</span><span>val</span><span><span> </span><span>=</span><span> </span></span><span>node</span><span>.</span><span>next</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>node</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>node</span><span>.</span><span>next</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>238. Product of Array Except Self<a href="#238-product-of-array-except-self"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/product-of-array-except-self/" target="_blank">https://leetcode.com/problems/product-of-array-except-self/</a></p><hr /><p>使用一个动态规划数组<code>result</code>，第一次从左到右循环，得到每个<code>nums[i]</code>左侧所有数的累乘结果，储存在<code>result</code>中；第二次从右到左循环，利用一个变量<code>right</code>乘以之前<code>result</code>中的结果，并让<code>right</code>乘以当前<code>nums[i]</code>，以此获得<code>nums[i]</code>右侧所有数的累乘结果。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>productExceptSelf</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[len];</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>result[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// product of left part</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>result[i] </span><span>=</span><span> result[i</span><span>-</span><span>1</span><span><span>] </span><span>*</span><span> nums[i</span><span>-</span></span><span>1</span><span>];</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// product of right part</span></div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>result[i] </span><span>*=</span><span> right;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>right </span><span>*=</span><span> nums[i];</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>239. Sliding Window Maximum<a href="#239-sliding-window-maximum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sliding-window-maximum/" target="_blank">https://leetcode.com/problems/sliding-window-maximum/</a></p><hr /><p>使用一个LinkedList模拟双头队列，队列存储当前窗口内所有元素的下标。流程有三步：</p><ol>
<li>关注<code>[i - k + 1, i]</code>的窗口，当某个元素在队列中且不在窗口内时，将其从队首弹出</li>
<li>从队列尾部开始，将所有对应小于<code>nums[i]</code>的下标丢弃。这是因为如果<code>nums[x] &lt; nums[i]</code>且<code>x &lt; i</code>，在当前窗口和之后的窗口里<code>nums[x]</code>都不可能成为最大值，因为<code>nums[i]</code>一定是更好的选择</li>
<li>将当前下标添加至队列，再将下标对应的值添加值最终的<code>result</code>数组</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>maxSlidingWindow</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&lt;</span><span> k) {</span></span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[] {};</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[len </span><span>-</span><span> k </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>9</div></div><div><span>        </span><span>LinkedList</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>list</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>// remove first element</span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>list</span><span>.</span><span>isEmpty</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>list</span><span>.</span><span>peek</span><span><span>() </span><span>&lt;</span><span> i </span><span>-</span><span> k </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>                </span><span>list</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>// remove unnecessary indices</span></div></div><div><div><div>18</div></div><div><span>            </span><span>while</span><span><span> (</span><span>!</span></span><span>list</span><span>.</span><span>isEmpty</span><span><span>() </span><span>&amp;&amp;</span><span> nums[i] </span><span>&gt;=</span><span> nums[</span></span><span>list</span><span>.</span><span>peekLast</span><span>()]) {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>list</span><span>.</span><span>pollLast</span><span>();</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>// new result</span></div></div><div><div><div>23</div></div><div><span>            </span><span>list</span><span>.</span><span>offer</span><span>(i);</span></div></div><div><div><div>24</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>-</span><span> k </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>&gt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>result[i </span><span>-</span><span> k </span><span>+</span><span> </span><span>1</span><span><span>] </span><span>=</span><span> nums[</span></span><span>list</span><span>.</span><span>peek</span><span>()];</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>240. Search a 2D Matrix II<a href="#240-search-a-2d-matrix-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/search-a-2d-matrix-ii/" target="_blank">https://leetcode.com/problems/search-a-2d-matrix-ii/</a></p><hr /><p>直接从第一行最右侧开始搜索，如果当前数比<code>target</code>小，则向左一列；当前数比<code>target</code>大，则向下一行。不断重复，若直到列或者行超出边界还没有找到<code>target</code>，就说明<code>target</code>不在数组中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>searchMatrix</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (matrix </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, col </span><span>=</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// start from the upper right</span></div></div><div><div><div>10</div></div><div><span>        </span><span>while</span><span><span> (col </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> row </span><span>&lt;</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span><span> (matrix[row][col] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>12</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (matrix[row][col] </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>row++;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>col--;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>241. Different Ways to Add Parentheses<a href="#241-different-ways-to-add-parentheses"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/different-ways-to-add-parentheses/" target="_blank">https://leetcode.com/problems/different-ways-to-add-parentheses/</a></p><hr /><p>核心是使用分治，遍历输入字符串，当前字符为界将字符串分为左、右两个子字符串，根据具体的运算符算出临时结果。为了节省时间，可以使用map存储算过的结果。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>// &lt;current input string, all possible results&gt;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>String</span><span><span>,</span><span> </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> map </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>diffWaysToCompute</span><span>(</span><span>String</span><span><span> </span><span>input</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>// check history</span></div></div><div><div><div>7</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>get</span><span>(input);</span></div></div><div><div><div>8</div></div><div><span>        </span><span>if</span><span><span> (result </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>result </span><span>=</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// only one digit left, put current result to map</span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span> (</span><span>isDigit</span><span>(input)) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>Integer</span><span>.</span><span>parseInt</span><span>(input));</span></div></div><div><div><div>16</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(input, result);</span></div></div><div><div><div>17</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>input</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>input</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>22</div></div><div><span>            </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'+'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'-'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'*'</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>                </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>diffWaysToCompute</span><span>(</span><span>input</span><span>.</span><span>substring</span><span>(</span><span>0</span><span>,i));</span></div></div><div><div><div>24</div></div><div><span>                </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>diffWaysToCompute</span><span>(</span><span>input</span><span>.</span><span>substring</span><span><span>(i</span><span>+</span></span><span>1</span><span>));</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>                </span><span>for</span><span> (</span><span>Integer</span><span><span> </span><span>il</span><span> </span></span><span>:</span><span> left) {</span></div></div><div><div><div>27</div></div><div><span>                    </span><span>for</span><span> (</span><span>Integer</span><span><span> </span><span>ir</span><span> </span></span><span>:</span><span> right) {</span></div></div><div><div><div>28</div></div><div><span>                        </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'+'</span><span>) {</span></div></div><div><div><div>29</div></div><div><span>                            </span><span>result</span><span>.</span><span>add</span><span><span>(il </span><span>+</span><span> ir);</span></span></div></div><div><div><div>30</div></div><div><span><span>                        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'-'</span><span>) {</span></div></div><div><div><div>31</div></div><div><span>                            </span><span>result</span><span>.</span><span>add</span><span><span>(il </span><span>-</span><span> ir);</span></span></div></div><div><div><div>32</div></div><div><span><span>                        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'*'</span><span>) {</span></div></div><div><div><div>33</div></div><div><span>                            </span><span>result</span><span>.</span><span>add</span><span><span>(il </span><span>*</span><span> ir);</span></span></div></div><div><div><div>34</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(input, result);</span></div></div><div><div><div>41</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isDigit</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>45</div></div><div><span>        </span><span>for</span><span> (</span><span>Character</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>s</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>46</div></div><div><span>            </span><span>if</span><span><span> (c </span><span>&lt;</span><span> </span></span><span>'0'</span><span><span> </span><span>||</span><span> c </span><span>&gt;</span><span> </span></span><span>'9'</span><span>) {</span></div></div><div><div><div>47</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>48</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>52</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>242. Valid Anagram<a href="#242-valid-anagram"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/valid-anagram/" target="_blank">https://leetcode.com/problems/valid-anagram/</a></p><hr /><p>人造一个map，存储s中每个字符出现的次数，再验证t中的每个字符出现的次数能否与之对应。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isAnagram</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>String</span><span><span> </span><span>t</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>!=</span><span> </span></span><span>t</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>256</span><span>];</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// how many times each characters occur in s</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>s</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>map[c]++;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// check whether match occurrence in t</span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>t</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>map[c]--;</span></div></div><div><div><div>16</div></div><div><span>            </span><span>if</span><span><span> (map[c] </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>17</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>243. Shortest Word Distance<a href="#243-shortest-word-distance"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/shortest-word-distance/" target="_blank">https://leetcode.com/problems/shortest-word-distance/</a></p><hr /><p>遍历<code>words</code>中的每一个单词，如果当前的单词等于<code>word1</code>或者<code>word2</code>，则对应修改两个单词的下标<code>index1</code>和<code>index2</code>；当下标都大于0时，更新当前的下标间距最小值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>shortestDistance</span><span>(</span><span>String</span><span><span>[] </span><span>words</span><span>, </span></span><span>String</span><span><span> </span><span>word1</span><span>, </span></span><span>String</span><span><span> </span><span>word2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>index1</span><span> </span></span><span><span>=</span><span> </span><span>-</span></span><span>1</span><span><span>, index2 </span><span>=</span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>words</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>// always update indices</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span> (words[i].</span><span>equals</span><span>(word1)) {</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>index1 </span><span>=</span><span> i;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (words[i].</span><span>equals</span><span>(word2)) {</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>index2 </span><span>=</span><span> i;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>if</span><span><span> (index1 </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> index2 </span><span>&gt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(result, </span><span>Math</span><span>.</span><span>abs</span><span><span>(index1 </span><span>-</span><span> index2));</span></span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>244. Shortest Word Distance II<a href="#244-shortest-word-distance-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/shortest-word-distance-ii/" target="_blank">https://leetcode.com/problems/shortest-word-distance-ii/</a></p><hr /><p>由于计算最短间距的函数可能被调用多次，因此直接的想法是将数组中每一个单词出现的下标都收录起来，整理成一个list。检查两个单词时，使用两个指针<code>p1</code>和<code>p2</code>分别遍历下标list，找到尽可能小的间距。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>WordDistance</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>// for each word, store its occurrence index</span></div></div><div><div><div>4</div></div><div><span>    </span><span>HashMap</span><span>&lt;</span><span>String</span><span><span>,</span><span> </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> map</span></span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>WordDistance</span><span>(</span><span>String</span><span><span>[] </span><span>words</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>map </span><span>=</span><span> </span><span>new</span><span> </span><span>HashMap</span><span>();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>words</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>String</span><span><span> </span><span>currentWord</span><span> </span></span><span><span>=</span><span> words[i];</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>map</span><span>.</span><span>containsKey</span><span>(currentWord)) {</span></div></div><div><div><div>11</div></div><div><span>                </span><span>map</span><span>.</span><span>put</span><span>(currentWord, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;());</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>            </span><span>map</span><span>.</span><span>get</span><span>(currentWord).</span><span>add</span><span>(i);</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>shortest</span><span>(</span><span>String</span><span><span> </span><span>word1</span><span>, </span></span><span>String</span><span><span> </span><span>word2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>list1</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>get</span><span><span>(word1), list2 </span><span>=</span><span> </span></span><span>map</span><span>.</span><span>get</span><span>(word2);</span></div></div><div><div><div>19</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>int</span><span><span> </span><span>p1</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, p2 </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>22</div></div><div><span>        </span><span>while</span><span><span> (p1 </span><span>&lt;</span><span> </span></span><span>list1</span><span>.</span><span>size</span><span><span>() </span><span>&amp;&amp;</span><span> p2 </span><span>&lt;</span><span> </span></span><span>list2</span><span>.</span><span>size</span><span>()) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>int</span><span><span> </span><span>index1</span><span> </span></span><span><span>=</span><span> </span></span><span>list1</span><span>.</span><span>get</span><span><span>(p1), index2 </span><span>=</span><span> </span></span><span>list2</span><span>.</span><span>get</span><span>(p2);</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>            </span><span>// make two pointers as close as possible</span></div></div><div><div><div>26</div></div><div><span>            </span><span>// shift the smaller index to its maximum value</span></div></div><div><div><div>27</div></div><div><span>            </span><span>if</span><span><span> (index1 </span><span>&gt;</span><span> index2) {</span></span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>p2++;</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>30</div></div><div><span><span>                </span></span><span>p1++;</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(result, </span><span>Math</span><span>.</span><span>abs</span><span><span>(index1 </span><span>-</span><span> index2));</span></span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>245. Shortest Word Distance III<a href="#245-shortest-word-distance-iii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/shortest-word-distance-iii/" target="_blank">https://leetcode.com/problems/shortest-word-distance-iii/</a></p><hr /><p>遍历循环。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>shortestWordDistance</span><span>(</span><span>String</span><span><span>[] </span><span>words</span><span>, </span></span><span>String</span><span><span> </span><span>word1</span><span>, </span></span><span>String</span><span><span> </span><span>word2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>index1</span><span> </span></span><span><span>=</span><span> </span><span>-</span></span><span>1</span><span><span>, index2 </span><span>=</span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>boolean</span><span><span> </span><span>isEqual</span><span> </span></span><span><span>=</span><span> </span></span><span>word1</span><span>.</span><span>equals</span><span>(word2);</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>words</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span> (words[i].</span><span>equals</span><span>(word1)) {</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>index1 </span><span>=</span><span> i;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (words[i].</span><span>equals</span><span>(word2)) {</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>index2 </span><span>=</span><span> i;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>if</span><span><span> (index1 </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> index2 </span><span>&gt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(result, </span><span>Math</span><span>.</span><span>abs</span><span><span>(index1 </span><span>-</span><span> index2));</span></span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>            </span><span>// if word1 and word2 are equal, their indices should be set equally before next loop</span></div></div><div><div><div>21</div></div><div><span>            </span><span>if</span><span> (isEqual) {</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>index2 </span><span>=</span><span> index1;</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>246. Strobogrammatic Number<a href="#246-strobogrammatic-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/strobogrammatic-number/" target="_blank">https://leetcode.com/problems/strobogrammatic-number/</a></p><hr /><p>使用头尾指针标记<code>num</code>，不断移动指针，完整遍历<code>num</code>，判断每次头尾指针组成的数是否组成了一对strobogrammatic number pairs。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isStrobogrammatic</span><span>(</span><span>String</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>check</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[</span><span>10</span><span>];</span></div></div><div><div><div>4</div></div><div><span>        </span><span>// strobogrammatic number</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>check[</span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>'1'</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>check[</span><span>6</span><span><span>] </span><span>=</span><span> </span></span><span>'9'</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>check[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>'0'</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>check[</span><span>9</span><span><span>] </span><span>=</span><span> </span></span><span>'6'</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>check[</span><span>8</span><span><span>] </span><span>=</span><span> </span></span><span>'8'</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>low</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, high </span><span>=</span><span> </span></span><span>num</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>while</span><span><span> (low </span><span>&lt;=</span><span> high) {</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>// must form strobogrammatic number pairs</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span> (</span><span>num</span><span>.</span><span>charAt</span><span><span>(low) </span><span>!=</span><span> check[</span></span><span>num</span><span>.</span><span>charAt</span><span><span>(high) </span><span>-</span><span> </span></span><span>'0'</span><span>]) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>low++;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>high--;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>247. Strobogrammatic Number II<a href="#247-strobogrammatic-number-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/strobogrammatic-number-ii/" target="_blank">https://leetcode.com/problems/strobogrammatic-number-ii/</a></p><hr /><p>调用递归，让当前字符数量不断减少2，以此能在首尾各自添加一个数字。添加的数字可以为11, 69, 96, 88；如果不是开头和结尾，还可以添加00。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>findStrobogrammatic</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span> </span><span>helper</span><span>(n, n);</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>private</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>helper</span><span>(</span><span>int</span><span><span> </span><span>current</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>if</span><span><span> (current </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>String</span><span>&gt;(</span><span>Arrays</span><span>.</span><span>asList</span><span>(</span><span>""</span><span>));</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>        </span><span>if</span><span><span> (current </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>String</span><span>&gt;(</span><span>Arrays</span><span>.</span><span>asList</span><span>(</span><span>"0"</span><span>, </span><span>"1"</span><span>, </span><span>"8"</span><span>));</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>// reduce current digits count by 2 and add two new digits to head and tail</span></div></div><div><div><div>15</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>list</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span><span>(current </span><span>-</span><span> </span></span><span>2</span><span>, n);</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>String</span><span>&gt;();</span></div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>list</span><span>.</span><span>size</span><span>(); i++) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>String</span><span><span> </span><span>s</span><span> </span></span><span><span>=</span><span> </span></span><span>list</span><span>.</span><span>get</span><span>(i);</span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span><span> (current </span><span>!=</span><span> n) {</span></span></div></div><div><div><div>21</div></div><div><span>                </span><span>// 00 cannot be head and tail</span></div></div><div><div><div>22</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(</span><span>"0"</span><span><span> </span><span>+</span><span> s </span><span>+</span><span> </span></span><span>"0"</span><span>);</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>"1"</span><span><span> </span><span>+</span><span> s </span><span>+</span><span> </span></span><span>"1"</span><span>);</span></div></div><div><div><div>25</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>"6"</span><span><span> </span><span>+</span><span> s </span><span>+</span><span> </span></span><span>"9"</span><span>);</span></div></div><div><div><div>26</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>"9"</span><span><span> </span><span>+</span><span> s </span><span>+</span><span> </span></span><span>"6"</span><span>);</span></div></div><div><div><div>27</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>"8"</span><span><span> </span><span>+</span><span> s </span><span>+</span><span> </span></span><span>"8"</span><span>);</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>248. Strobogrammatic Number III<a href="#248-strobogrammatic-number-iii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/strobogrammatic-number-iii/" target="_blank">https://leetcode.com/problems/strobogrammatic-number-iii/</a></p><hr /><p>使用DFS，提前列举好所有的strobogrammatic number pairs，之后使用头尾指针判断是否符合当前指针所指的两个数是否符合strobogrammatic规则。当头尾指针重合后，需要额外判断当前数是否超出了给定<code>[low, high]</code>的范围，如果在范围内才算做一个合法的数字。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>strobogrammaticInRange</span><span>(</span><span>String</span><span><span> </span><span>low</span><span>, </span></span><span>String</span><span><span> </span><span>high</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>low</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>while</span><span><span> (n </span><span>&lt;=</span><span> </span></span><span>high</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>dfs</span><span>(</span><span>0</span><span><span>, n </span><span>-</span><span> </span></span><span>1</span><span>, </span><span>new</span><span> </span><span>char</span><span>[n], low, high);</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>n++;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span>private</span><span> </span><span>char</span><span>[][] converts </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[][]{</span><span>new</span><span> </span><span>char</span><span>[]{</span><span>'0'</span><span><span> </span><span>,</span></span><span>'0'</span><span><span>}</span><span>,</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[]{</span><span>'1'</span><span><span> </span><span>,</span></span><span>'1'</span><span><span>}</span><span>,</span></span></div></div><div><div><div>12</div></div><div><span>                                             </span><span>new</span><span> </span><span>char</span><span>[]{</span><span>'6'</span><span><span> </span><span>,</span></span><span>'9'</span><span><span>}</span><span>,</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[]{</span><span>'8'</span><span><span> </span><span>,</span></span><span>'8'</span><span><span>}</span><span>,</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[]{</span><span>'9'</span><span><span> </span><span>,</span></span><span>'6'</span><span><span>}}</span><span>;</span></span></div></div><div><div><div>13</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> result </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>, </span></span><span>char</span><span><span>[] </span><span>num</span><span>, </span></span><span>String</span><span><span> </span><span>low</span><span>, </span></span><span>String</span><span><span> </span><span>high</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span><span> (i </span><span>&gt;</span><span> j) {</span></span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>isSmallerThan</span><span><span>(num, low) </span><span>&amp;&amp;</span><span> </span><span>!</span></span><span>isLargerThan</span><span>(num, high)) {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>result++;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>// try two digits</span></div></div><div><div><div>24</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span>[] </span><span>convert</span><span> </span></span><span>:</span><span> converts) {</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>num[i] </span><span>=</span><span> convert[</span><span>0</span><span>];</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>num[j] </span><span>=</span><span> convert[</span><span>1</span><span>];</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>num</span><span>.</span><span>length</span><span><span> </span><span>&gt;</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> convert[</span></span><span>0</span><span><span>] </span><span>==</span><span> </span></span><span>'0'</span><span>) {</span></div></div><div><div><div>29</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>==</span><span> j </span><span>&amp;&amp;</span><span> convert[</span></span><span>0</span><span><span>] </span><span>!=</span><span> convert[</span></span><span>1</span><span>]) {</span></div></div><div><div><div>32</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>            </span><span>dfs</span><span><span>(i </span><span>+</span><span> </span></span><span>1</span><span><span>, j </span><span>-</span><span> </span></span><span>1</span><span>, num, low, high);</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isLargerThan</span><span>(</span><span>char</span><span><span>[] </span><span>num</span><span>, </span></span><span>String</span><span><span> </span><span>high</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>39</div></div><div><span>        </span><span>if</span><span> (</span><span>num</span><span>.</span><span>length</span><span><span> </span><span>&lt;</span><span> </span></span><span>high</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>40</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>43</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>high</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>44</div></div><div><span>            </span><span>if</span><span><span> (num[i] </span><span>==</span><span> </span></span><span>high</span><span>.</span><span>charAt</span><span>(i)) {</span></div></div><div><div><div>45</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>46</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>47</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>            </span><span>return</span><span><span> num[i] </span><span>&gt;</span><span> </span></span><span>high</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>53</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>54</div></div><div>
</div></div><div><div><div>55</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isSmallerThan</span><span>(</span><span>char</span><span><span>[] </span><span>num</span><span>, </span></span><span>String</span><span><span> </span><span>low</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>56</div></div><div><span>        </span><span>if</span><span> (</span><span>num</span><span>.</span><span>length</span><span><span> </span><span>&gt;</span><span> </span></span><span>low</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>57</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>58</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>59</div></div><div>
</div></div><div><div><div>60</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>61</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>low</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>62</div></div><div><span>            </span><span>if</span><span><span> (num[i] </span><span>==</span><span> </span></span><span>low</span><span>.</span><span>charAt</span><span>(i)) {</span></div></div><div><div><div>63</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>64</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>65</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>66</div></div><div>
</div></div><div><div><div>67</div></div><div><span>            </span><span>return</span><span><span> num[i] </span><span>&lt;</span><span> </span></span><span>low</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>68</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>69</div></div><div>
</div></div><div><div><div>70</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>71</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>72</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>249. Group Shifted Strings<a href="#249-group-shifted-strings"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/group-shifted-strings/" target="_blank">https://leetcode.com/problems/group-shifted-strings/</a></p><hr /><p>对每一个输入字符串进行编辑，其他字母和首字母进行比较，如果其他字母的ASCII码比首字母小，需要补26作为循环，由此生成一个对应当前结构的<code>key</code>。再使用一个map，存储每个<code>key</code>对应的所有字符串，最后直接利用<code>map.values()</code>自动整理生成归类后的二维list。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt;</span><span> </span></span><span>groupStrings</span><span>(</span><span>String</span><span><span>[] </span><span>strings</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>String</span><span>, </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; &gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>str</span><span> </span></span><span>:</span><span> strings) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>String</span><span><span> </span><span>key</span><span> </span></span><span><span>=</span><span> </span></span><span>getKey</span><span>(str);</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span>(key)) {</span></div></div><div><div><div>8</div></div><div><span>                </span><span>map</span><span>.</span><span>get</span><span>(key).</span><span>add</span><span>(str);</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>10</div></div><div><span>                </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>temp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>11</div></div><div><span>                </span><span>temp</span><span>.</span><span>add</span><span>(str);</span></div></div><div><div><div>12</div></div><div><span>                </span><span>map</span><span>.</span><span>put</span><span>(key, temp); </span><span>// add new key</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// generate 2D list</span></div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(</span><span>map</span><span>.</span><span>values</span><span>());</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span>private</span><span> </span><span>String</span><span> </span><span>getKey</span><span>(</span><span>String</span><span><span> </span><span>str</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>21</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>key</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>22</div></div><div><span>        </span><span>int</span><span><span> </span><span>diff</span><span> </span></span><span><span>=</span><span> </span></span><span>str</span><span>.</span><span>charAt</span><span>(</span><span>0</span><span><span>) </span><span>-</span><span> </span></span><span>'a'</span><span>;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// if other character's ascii code is smaller than first character, complement 26 for rotation</span></div></div><div><div><div>25</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>str</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>int</span><span><span> </span><span>value</span><span> </span></span><span><span>=</span><span> </span></span><span>str</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span><span> </span><span>&lt;</span><span> diff </span></span><span>?</span><span> </span><span>str</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span><span> </span><span>-</span><span> diff </span><span>+</span><span> </span></span><span>26</span></div></div><div><div><div>27</div></div><div><span>                                                   </span><span>:</span><span> </span><span>str</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span><span> </span><span>-</span><span> diff;</span></span></div></div><div><div><div>28</div></div><div><span>            </span><span>key</span><span>.</span><span>append</span><span>((</span><span>char</span><span>)value);</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span> </span><span>key</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>250. Count Univalue Subtrees<a href="#250-count-univalue-subtrees"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/count-univalue-subtrees/" target="_blank">https://leetcode.com/problems/count-univalue-subtrees/</a></p><hr /><p>使用后序遍历，在左右子树都是univalue树的前提下，判断当前节点和左、右节点是否一致。如果左、右任一节点存在且与当前节点不一样，就说明当前节点为根的树不是univalue；反之，univalue树的数量加1。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>countUnivalSubtrees</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>1</span><span>]; </span><span>// modify global value to get final result</span></div></div><div><div><div>19</div></div><div><span>        </span><span>helper</span><span>(root, result);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result[</span><span>0</span><span>];</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>helper</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>, </span></span><span>int</span><span><span>[] </span><span>result</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>        </span><span>boolean</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span>(</span><span>node</span><span>.</span><span>left</span><span>, result);</span></div></div><div><div><div>28</div></div><div><span>        </span><span>boolean</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span>(</span><span>node</span><span>.</span><span>right</span><span>, result);</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// both left and right subtrees are univalue trees, check subtrees</span></div></div><div><div><div>31</div></div><div><span>        </span><span>if</span><span><span> (left </span><span>&amp;&amp;</span><span> right) {</span></span></div></div><div><div><div>32</div></div><div><span>            </span><span>// current node's val must be same with left child and right child</span></div></div><div><div><div>33</div></div><div><span>            </span><span>if</span><span> ((</span><span>node</span><span>.</span><span>left</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>node</span><span>.</span><span>val</span><span><span> </span><span>!=</span><span> </span></span><span>node</span><span>.</span><span>left</span><span>.</span><span>val</span><span>)</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>||</span><span> (</span><span>node</span><span>.</span><span>right</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>node</span><span>.</span><span>val</span><span><span> </span><span>!=</span><span> </span></span><span>node</span><span>.</span><span>right</span><span>.</span><span>val</span><span>)) {</span></div></div><div><div><div>35</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>result[</span><span>0</span><span>]++;</span></div></div><div><div><div>38</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>        </span><span>// one subtree is not univalue tree, no more further check</span></div></div><div><div><div>42</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>251. Flatten 2D Vector<a href="#251-flatten-2d-vector"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/flatten-2d-vector/" target="_blank">https://leetcode.com/problems/flatten-2d-vector/</a></p><hr /><p>使用一个二维数组<code>temp</code>，浅拷贝传入的数组。</p><p>检查是否存在下一个元素：</p><ul>
<li>当前行没遍历到结尾，肯定还有下一个元素</li>
<li>当前行遍历到结尾，尝试跳转到下一行，检查行数是否越界。</li>
</ul><p>获取下一个元素，移动相应二维数组下标即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Vector2D</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>int</span><span>[][] temp</span><span><span>;</span><span> </span></span><span>// shallow copy input array</span></div></div><div><div><div>4</div></div><div><span>    </span><span>int</span><span> row </span><span><span>=</span><span> </span></span><span>0</span><span><span>,</span><span> col </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>Vector2D</span><span>(</span><span>int</span><span><span>[][] </span><span>v</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>temp </span><span>=</span><span> v;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>next</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>11</div></div><div><span>        </span><span>// if there is next element, fetch it</span></div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span> </span><span>hasNext</span><span>() </span><span>?</span><span> temp[row][col++] </span><span>:</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>hasNext</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>16</div></div><div><span>        </span><span>// one row's end, jump to next row</span></div></div><div><div><div>17</div></div><div><span>        </span><span>while</span><span><span> (row </span><span>&lt;</span><span> </span></span><span>temp</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> col </span><span>==</span><span> temp[row].</span></span><span>length</span><span>) {</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>row++;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>col </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// whether go through all rows</span></div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span><span> row </span><span>&lt;</span><span> </span></span><span>temp</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>252. Meeting Rooms<a href="#252-meeting-rooms"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/meeting-rooms/" target="_blank">https://leetcode.com/problems/meeting-rooms/</a></p><hr /><p>对每个子数组按照起始时间大小进行排序，之后检查是否有相邻会议的结束时间和起始时间重叠。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>canAttendMeetings</span><span>(</span><span>int</span><span><span>[][] </span><span>intervals</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>intervals</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> intervals[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(intervals, (</span><span>int</span><span>[] a, </span><span>int</span><span>[] b) </span><span>-&gt;</span><span> {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>return</span><span> a[</span><span>0</span><span><span>] </span><span>-</span><span> b[</span></span><span>0</span><span>];</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>});</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>// overlap with previous interval</span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span> (intervals[i][</span><span>0</span><span><span>] </span><span>&lt;</span><span> intervals[i </span><span>-</span><span> </span></span><span>1</span><span>][</span><span>1</span><span>]) {</span></div></div><div><div><div>14</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>253. Meeting Rooms II<a href="#253-meeting-rooms-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/meeting-rooms-ii/" target="_blank">https://leetcode.com/problems/meeting-rooms-ii/</a></p><hr /><p>将所有会议对开始时间和结束时间提取出来，分别整理成独立数组并排序。假设每开始一场会议都要占用一个房间，然而如果之前的一场会议已经结束，说明之前的这个房间可以被释放并挪用于当前的会议。因此，使用一个变量<code>endIdx</code>跟踪当前会议的结束情况，如果当前的会议的起始时间不小于之前最早开始的一场会议的结束时间，就不需要额外开一个新会议室。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minMeetingRooms</span><span>(</span><span>int</span><span><span>[][] </span><span>intervals</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (intervals </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> intervals[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// fetch all start and end time, then sort</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>starts</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[len];</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>ends</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[len];</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>starts[i] </span><span>=</span><span> intervals[i][</span><span>0</span><span>];</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>ends[i] </span><span>=</span><span> intervals[i][</span><span>1</span><span>];</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(starts);</span></div></div><div><div><div>16</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(ends);</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>// use endIdx to track current ending meeting</span></div></div><div><div><div>19</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, endIdx </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>21</div></div><div><span>            </span><span>// assume each meeting needs a room first</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>result++;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>            </span><span>// current start time is after one ending meeting, no need to arrange one room</span></div></div><div><div><div>25</div></div><div><span>            </span><span>if</span><span><span> (starts[i] </span><span>&gt;=</span><span> ends[endIdx]) {</span></span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>result--;</span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>endIdx++;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>254. Factor Combinations<a href="#254-factor-combinations"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/factor-combinations/" target="_blank">https://leetcode.com/problems/factor-combinations/</a></p><hr /><p>本质上这题仍然是传统的backtrack问题。然而，技巧在于此题在下一轮dfs前进行加速，即：每一轮向临时数组添加时，<code>i</code>和<code>n/i</code>成对搭配，这样一来既能马上凑出一对combination，也可以节省时间，使得<code>i</code>的遍历只需要到达<code>sqrt(i)</code>即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>getFactors</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span>&gt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>backtrack</span><span>(result, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(), n, </span><span>2</span><span>);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>temp</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span> </span><span>start</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span>        </span><span>// when n &lt; 2, we must ensure we have more than 1 combination to get one result</span></div></div><div><div><div>10</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>&lt;</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span> (</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(temp));</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> start; i </span><span>*</span><span> i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>18</div></div><div><span>            </span><span>if</span><span><span> (n </span><span>%</span><span> i </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>// add both i and n/i</span></div></div><div><div><div>20</div></div><div><span>                </span><span>temp</span><span>.</span><span>add</span><span>(i);</span></div></div><div><div><div>21</div></div><div><span>                </span><span>temp</span><span>.</span><span>add</span><span><span>(n </span><span>/</span><span> i);</span></span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(temp));</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>                </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>); </span><span>// remove n/i</span></div></div><div><div><div>26</div></div><div><span>                </span><span>backtrack</span><span><span>(result, temp, n </span><span>/</span><span> i, i);</span></span></div></div><div><div><div>27</div></div><div><span>                </span><span>temp</span><span>.</span><span>remove</span><span>(</span><span>temp</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>); </span><span>// remove i</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>255. Verify Preorder Sequence in Binary Search Tree<a href="#255-verify-preorder-sequence-in-binary-search-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/verify-preorder-sequence-in-binary-search-tree/" target="_blank">https://leetcode.com/problems/verify-preorder-sequence-in-binary-search-tree/</a></p><hr /><p>模拟一个栈。假如遇到了比上一个栈顶值小的数，说明我们还在所有栈元素的左子树上，因此只需要把这个数也加入栈。然而，在此之前需要把所有更小的祖先值给踢出，因此我们遍历完之后需要跳转到右支了。设立弹出值为下界，之后遍历右支意味着不能遇到一个比下界更小的数，否则就是不合法的。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>verifyPreorder</span><span>(</span><span>int</span><span><span>[] </span><span>preorder</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// lower bound</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>low</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span><span>, i </span><span>=</span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>p</span><span> </span></span><span>:</span><span> preorder) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>// we cannot meet an element smaller than lower bound</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (p </span><span>&lt;</span><span> low) {</span></span></div></div><div><div><div>9</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>// assume current p is root node, we need to find the furthest node preorder[i] &lt; p</span></div></div><div><div><div>13</div></div><div><span>            </span><span>// this indicates that we are still on the left subtree</span></div></div><div><div><div>14</div></div><div><span>            </span><span>while</span><span><span> (i </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> p </span><span>&gt;</span><span> preorder[i]) {</span></span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>low </span><span>=</span><span> preorder[i];</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>i--;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>// to right subtree</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>i++;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>preorder[i] </span><span>=</span><span> p;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>256. Paint House<a href="#256-paint-house"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/paint-house/" target="_blank">https://leetcode.com/problems/paint-house/</a></p><hr /><p>从第二行起直接修改输入的<code>cost</code>数组，<code>cost[i][j]</code>表示当前颜色成本加上之前使用另两种颜色刷房子的成本的最小值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minCost</span><span>(</span><span>int</span><span><span>[][] </span><span>costs</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (costs </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>costs</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// current house's cost and two other houses' previous total cost</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>costs</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>costs[i][</span><span>0</span><span><span>] </span><span>+=</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span><span>(costs[i</span><span>-</span></span><span>1</span><span>][</span><span>1</span><span><span>], costs[i</span><span>-</span></span><span>1</span><span>][</span><span>2</span><span>]);</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>costs[i][</span><span>1</span><span><span>] </span><span>+=</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span><span>(costs[i</span><span>-</span></span><span>1</span><span>][</span><span>0</span><span><span>], costs[i</span><span>-</span></span><span>1</span><span>][</span><span>2</span><span>]);</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>costs[i][</span><span>2</span><span><span>] </span><span>+=</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span><span>(costs[i</span><span>-</span></span><span>1</span><span>][</span><span>0</span><span><span>], costs[i</span><span>-</span></span><span>1</span><span>][</span><span>1</span><span>]);</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>costs</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(</span><span>Math</span><span>.</span><span>min</span><span>(costs[n][</span><span>0</span><span>], costs[n][</span><span>1</span><span>]), costs[n][</span><span>2</span><span>]);</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>257. Binary Tree Paths<a href="#257-binary-tree-paths"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-paths/" target="_blank">https://leetcode.com/problems/binary-tree-paths/</a></p><hr /><p>使用前序遍历到达叶节点，之后回溯遍历其他路径。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>binaryTreePaths</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>list</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>paths</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>5</div></div><div><span>        </span><span>helper</span><span>(root, list, paths);</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> paths;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>helper</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>list</span><span>, </span></span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>paths</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>// leaf node, add previous string and current value</span></div></div><div><div><div>15</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>root</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>17</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>element</span><span> </span></span><span>:</span><span> list) {</span></div></div><div><div><div>18</div></div><div><span>                </span><span>sb</span><span>.</span><span>append</span><span>(element);</span></div></div><div><div><div>19</div></div><div><span>                </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>"-&gt;"</span><span>);</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>root</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>22</div></div><div><span>            </span><span>paths</span><span>.</span><span>add</span><span>(</span><span>sb</span><span>.</span><span>toString</span><span>());</span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>// backtrack</span></div></div><div><div><div>27</div></div><div><span>        </span><span>list</span><span>.</span><span>add</span><span>(</span><span>root</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>28</div></div><div><span>        </span><span>helper</span><span>(</span><span>root</span><span>.</span><span>left</span><span>, list, paths);</span></div></div><div><div><div>29</div></div><div><span>        </span><span>helper</span><span>(</span><span>root</span><span>.</span><span>right</span><span>, list, paths);</span></div></div><div><div><div>30</div></div><div><span>        </span><span>list</span><span>.</span><span>remove</span><span>(</span><span>list</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>258. Add Digits<a href="#258-add-digits"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/add-digits/" target="_blank">https://leetcode.com/problems/add-digits/</a></p><hr /><p>直接归纳总结公式。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>addDigits</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span> </span><span>1</span><span><span> </span><span>+</span><span> (num </span><span>-</span><span> </span></span><span>1</span><span><span>) </span><span>%</span><span> </span></span><span>9</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>259. 3Sum Smaller<a href="#259-3sum-smaller"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/3sum-smaller/" target="_blank">https://leetcode.com/problems/3sum-smaller/</a></p><hr /><p>先排序，再使用三指针法，注意计数时，固定<code>first</code>和<code>second</code>，计算<code>second</code>和<code>third</code>之间的差值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>threeSumSmaller</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(nums);</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>first</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; first </span><span>&lt;</span><span> len </span><span>-</span><span> </span></span><span>2</span><span>; first++) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (nums[first] </span><span>*</span><span> </span></span><span>3</span><span><span> </span><span>&gt;=</span><span> target) {</span></span></div></div><div><div><div>9</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>int</span><span><span> </span><span>second</span><span> </span></span><span><span>=</span><span> first </span><span>+</span><span> </span></span><span>1</span><span><span>, third </span><span>=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>            </span><span>// fix first, range count in [second + 1, third]</span></div></div><div><div><div>15</div></div><div><span>            </span><span>while</span><span><span> (second </span><span>&lt;</span><span> third) {</span></span></div></div><div><div><div>16</div></div><div><span>                </span><span>if</span><span><span> (nums[first] </span><span>+</span><span> nums[second] </span><span>+</span><span> nums[third] </span><span>&lt;</span><span> target) {</span></span></div></div><div><div><div>17</div></div><div><span><span>                    </span></span><span>result </span><span>+=</span><span> third </span><span>-</span><span> second;</span></div></div><div><div><div>18</div></div><div><span><span>                    </span></span><span>second++;</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>third--;</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>260. Single Number III<a href="#260-single-number-iii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/single-number-iii/" target="_blank">https://leetcode.com/problems/single-number-iii/</a></p><hr /><p>第一次遍历，与Single Number相同思想，找出两个single number的异或值。由于这两个数不同，因此异或的结果一定有一位是1（Set Bit)，任意保存一位即可。（例如，通过和负数取与，保留最后一位）</p><p>第二次遍历，将所有数分类，一类与异或数取与为0（不包含Set Bit），另一类为1（包含Set Bit），由于其他数一定能两两配对，因此最后分类后的异或结果就是两个single number。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>singleNumber</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&lt;</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[] {};</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// get xor of two single numbers, keep only the last set bit</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>xor</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>xor </span><span>^=</span><span> num;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>xor </span><span>&amp;=</span><span> </span><span>-</span><span>xor;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>// use set bit to classify, each group's result is a single number</span></div></div><div><div><div>15</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> {</span></span><span>0</span><span>, </span><span>0</span><span>};</span></div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span><span> ((num </span><span>&amp;</span><span> xor) </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>result[</span><span>0</span><span><span>] </span><span>^=</span><span> num;</span></span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>result[</span><span>1</span><span><span>] </span><span>^=</span><span> num;</span></span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>261. Graph Valid Tree<a href="#261-graph-valid-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/graph-valid-tree/" target="_blank">https://leetcode.com/problems/graph-valid-tree/</a></p><hr /><p>假定每个点是一个孤岛，使用union-find的思想，查找出每条边延伸下去最末端的孤岛是什么。如果末端相等，说明重合，即树中存在环，不合法；否则，更新当前的岛连接情况。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>validTree</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span>[][] </span><span>edges</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>edges</span><span>.</span><span>length</span><span><span> </span><span>!=</span><span> n </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// n nodes</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>nums</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>9</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span><span>(nums, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>edges</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>int</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> </span></span><span>find</span><span>(nums, edges[i][</span><span>0</span><span>]);</span></div></div><div><div><div>13</div></div><div><span>            </span><span>int</span><span><span> </span><span>y</span><span> </span></span><span><span>=</span><span> </span></span><span>find</span><span>(nums, edges[i][</span><span>1</span><span>]);</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>            </span><span>// furthest nodes are the same, so there must be a cycle</span></div></div><div><div><div>16</div></div><div><span>            </span><span>if</span><span><span> (x </span><span>==</span><span> y) {</span></span></div></div><div><div><div>17</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>nums[x] </span><span>=</span><span> y;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>    </span><span>// find the furthest node</span></div></div><div><div><div>26</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>find</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>if</span><span><span> (nums[i] </span><span>==</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>28</div></div><div><span>            </span><span>return</span><span> i;</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span> </span><span>find</span><span>(nums, nums[i]);</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>262. Trips and Users<a href="#262-trips-and-users"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/trips-and-users/" target="_blank">https://leetcode.com/problems/trips-and-users/</a></p><hr /><p>拼接两张表，限制时间，用户账号状态作为筛选条件，选出所有取消的订单并除以总订单数。使用<code>ROUND()</code>函数保留两位小数。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> request_at </span><span>as</span><span> </span><span>Day</span><span>, </span><span>Round</span><span>(</span><span>Sum</span><span>(</span><span>If</span><span>(</span><span>status</span><span>!=</span><span>"completed"</span><span>,</span><span>1</span><span>,</span><span>0</span><span>)) / </span><span>count</span><span>(</span><span>status</span><span>), </span><span>2</span><span>) </span><span>as</span><span> </span><span>"Cancellation Rate"</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> trips</span></div></div><div><div><div>3</div></div><div><span>WHERE</span><span> request_at </span><span>BETWEEN</span><span> </span><span>"2013-10-01"</span><span> </span><span>AND</span><span> </span><span>"2013-10-03"</span></div></div><div><div><div>4</div></div><div><span>    </span><span>AND</span><span> client_id </span><span>NOT</span><span> </span><span>IN</span><span> (</span><span>SELECT</span><span> users_id </span><span>FROM</span><span> Users </span><span>WHERE</span><span><span> banned </span><span>=</span><span> </span></span><span>"yes"</span><span>)</span></div></div><div><div><div>5</div></div><div><span>    </span><span>AND</span><span> driver_id </span><span>NOT</span><span> </span><span>IN</span><span> (</span><span>SELECT</span><span> users_id </span><span>FROM</span><span> Users </span><span>WHERE</span><span><span> banned </span><span>=</span><span> </span></span><span>"yes"</span><span>)</span></div></div><div><div><div>6</div></div><div><span>GROUP BY</span><span> request_at</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>263. Ugly Number<a href="#263-ugly-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/ugly-number/" target="_blank">https://leetcode.com/problems/ugly-number/</a></p><hr /><p>让<code>num</code>循环除2-5之间的数，判断最后结果是否为1。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isUgly</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (num </span><span>&lt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// keep divide by 2, then 3, then 5</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>2</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>6</span><span><span> </span><span>&amp;&amp;</span><span> num </span><span>&gt;</span><span> </span></span><span>0</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>while</span><span><span> (num </span><span>%</span><span> i </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>num </span><span>/=</span><span> i;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span><span> num </span><span>==</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>264. Ugly Number II<a href="#264-ugly-number-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/ugly-number-ii/" target="_blank">https://leetcode.com/problems/ugly-number-ii/</a></p><hr /><p>每个数实际上由因数和序数相乘得到，因此使用动态规划，直接按大小添加当前的ugly number，再根据其因数更新对应的序数即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>nthUglyNumber</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>factor2</span><span> </span></span><span><span>=</span><span> </span></span><span>2</span><span><span>, factor3 </span><span>=</span><span> </span></span><span>3</span><span><span>, factor5 </span><span>=</span><span> </span></span><span>5</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>index2</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, index3 </span><span>=</span><span> </span></span><span>0</span><span><span>, index5 </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>int</span><span><span> </span><span>min</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span>(</span><span>Math</span><span>.</span><span>min</span><span>(factor2, factor3), factor5);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>// current ugly number</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>dp[i] </span><span>=</span><span> min;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>            </span><span>// update last ugly number using 2/3/5 as factor, then increment corresponding index</span></div></div><div><div><div>16</div></div><div><span>            </span><span>if</span><span><span> (factor2 </span><span>==</span><span> min) {</span></span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>index2++;</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>factor2 </span><span>=</span><span> </span><span>2</span><span><span> </span><span>*</span><span> dp[index2];</span></span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span><span> (factor3 </span><span>==</span><span> min) {</span></span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>index3++;</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>factor3 </span><span>=</span><span> </span><span>3</span><span><span> </span><span>*</span><span> dp[index3];</span></span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>            </span><span>if</span><span><span> (factor5 </span><span>==</span><span> min) {</span></span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>index5++;</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>factor5 </span><span>=</span><span> </span><span>5</span><span><span>*</span><span>dp[index5];</span></span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span><span> dp[n </span><span>-</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>265. Paint House II<a href="#265-paint-house-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/paint-house-ii/" target="_blank">https://leetcode.com/problems/paint-house-ii/</a></p><hr /><p>正常情况下，对于每一间房子的选择，只需要选出成本最低的即可。但由于相邻两间房子不能使用相同颜色，因此我们需要使用两个变量分别保存全局的第一小和第二小成本，并且额外使用一个变量<code>index1</code>记录上一间房最后使用的颜色。在当前的成本到总成本时需要观察，根据上一轮房子选择的情况，选择要累加的变量（<code>min1st</code>或者<code>min2nd</code>）。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minCostII</span><span>(</span><span>int</span><span><span>[][] </span><span>costs</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>costs</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// 1st-min cost, 2nd-min cost, maintain the index of min1st color cost of "last house"</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>min1st</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, min2nd </span><span>=</span><span> </span></span><span>0</span><span><span>, index1 </span><span>=</span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>costs</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>// temp value</span></div></div><div><div><div>12</div></div><div><span>            </span><span>int</span><span><span> </span><span>m1</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span><span>, m2 </span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span><span>, idx </span><span>=</span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> costs[</span></span><span>0</span><span>].</span><span>length</span><span>; j++) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>// adjacent houses cannot have same color</span></div></div><div><div><div>16</div></div><div><span>                </span><span>int</span><span><span> </span><span>cost</span><span> </span></span><span><span>=</span><span> costs[i][j] </span><span>+</span><span> (j </span><span>!=</span><span> index1 </span></span><span>?</span><span> min1st </span><span>:</span><span> min2nd);</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>                </span><span>if</span><span><span> (cost </span><span>&lt;</span><span> m1) {</span></span></div></div><div><div><div>19</div></div><div><span>                    </span><span>// cost &lt; m1 &lt; m2, update 1st-min, 2nd-min cost and index</span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>m2 </span><span>=</span><span> m1;</span></div></div><div><div><div>21</div></div><div><span><span>                    </span></span><span>m1 </span><span>=</span><span> cost;</span></div></div><div><div><div>22</div></div><div><span><span>                    </span></span><span>idx </span><span>=</span><span> j;</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (cost </span><span>&lt;</span><span> m2) {</span></span></div></div><div><div><div>24</div></div><div><span>                    </span><span>// m1 &lt; cost &lt; m2, update 2nd-min cost</span></div></div><div><div><div>25</div></div><div><span><span>                    </span></span><span>m2 </span><span>=</span><span> cost;</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>min1st </span><span>=</span><span> m1;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>min2nd </span><span>=</span><span> m2;</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>index1 </span><span>=</span><span> idx;</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>return</span><span> min1st;</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>266. Palindrome Permutation<a href="#266-palindrome-permutation"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/palindrome-permutation/" target="_blank">https://leetcode.com/problems/palindrome-permutation/</a></p><hr /><p>使用Set, 不断添加当前字符到Set中。如果已有这个字符，说明这两个相同字符可以组成一个pair而抵消；反之，作为一个新字符加入。遍历完之后，根据奇偶性讨论，Set中至多只能有1个字符。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>canPermutePalindrome</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>Character</span><span><span>&gt; </span><span>set</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>s</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>// one pair, remove</span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span> (</span><span>set</span><span>.</span><span>contains</span><span>(c)) {</span></div></div><div><div><div>11</div></div><div><span>                </span><span>set</span><span>.</span><span>remove</span><span>(c);</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>set</span><span>.</span><span>add</span><span>(c);</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// odd or even</span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> </span><span>set</span><span>.</span><span>size</span><span><span>() </span><span>&lt;=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>267. Palindrome Permutation II<a href="#267-palindrome-permutation-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/palindrome-permutation-ii/" target="_blank">https://leetcode.com/problems/palindrome-permutation-ii/</a></p><hr /><p>先统计每个字符出现的次数，排除掉肯定不能组成palindromic permutation的情况。之后使用回溯算法，只要当前字符次数还有剩余，就将2个字符分配到当前字符串的首尾，并继续调用下一层构造函数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>generatePalindromes</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// each character's count</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>256</span><span>];</span></div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>s</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>count[c]++;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// odd character count</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>oddChars</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div><span>        </span><span>Character</span><span><span> </span><span>odd</span><span> </span></span><span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>count</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span><span> (count[i] </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>oddChars++;</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>odd </span><span>=</span><span> (</span><span>char</span><span>)(i);</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>// no palindromic permutations</span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span><span> (oddChars </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>local</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[</span><span>s</span><span>.</span><span>length</span><span>()];</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>// one odd char, must be in the middle of the string</span></div></div><div><div><div>27</div></div><div><span>        </span><span>if</span><span><span> (oddChars </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>local[</span><span>local</span><span>.</span><span>length</span><span><span> </span><span>/</span><span> </span></span><span>2</span><span><span>] </span><span>=</span><span> odd;</span></span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>count[odd]--;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>33</div></div><div><span>        </span><span>backtrack</span><span>(count, </span><span>0</span><span>, local, result);</span></div></div><div><div><div>34</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>int</span><span><span>[] </span><span>count</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>, </span></span><span>char</span><span><span>[] </span><span>local</span><span>, </span></span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>38</div></div><div><span>        </span><span>// base case</span></div></div><div><div><div>39</div></div><div><span>        </span><span>if</span><span><span> (index </span><span>==</span><span> </span></span><span>local</span><span>.</span><span>length</span><span><span> </span><span>/</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>40</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>String</span><span>(local));</span></div></div><div><div><div>41</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>        </span><span>// try all even number chars</span></div></div><div><div><div>45</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>count</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>46</div></div><div><span>            </span><span>if</span><span><span> (count[i] </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>47</div></div><div><span>                </span><span>// allocate (char)i to head and tail of current string</span></div></div><div><div><div>48</div></div><div><span><span>                </span></span><span>local[index] </span><span>=</span><span> local[</span><span>local</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>-</span><span> index] </span><span>=</span><span> (</span></span><span>char</span><span>)(i);</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span><span>                </span></span><span>count[i] </span><span>-=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>51</div></div><div><span>                </span><span>backtrack</span><span><span>(count, index </span><span>+</span><span> </span></span><span>1</span><span>, local, result);</span></div></div><div><div><div>52</div></div><div><span><span>                </span></span><span>count[i] </span><span>+=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>53</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>56</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>268. Missing Number<a href="#268-missing-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/missing-number/" target="_blank">https://leetcode.com/problems/missing-number/</a></p><hr /><p>第一种方法，使用异或。每个数的下标与本身本应是一致的，因此二者异或结果是0。只有缺失的这个数，其本身将无法被异或填补。</p><p>例如以<code>[0, 1, 2, 3, 4, 5, 6, 7, 9, 10]</code>为例：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>下标i：</span></div></div><div><div><div>2</div></div><div><span>0 1 2 3 4 5 6 7 8 9 ...</span></div></div><div><div><div>3</div></div><div><span>数值nums[i]：</span></div></div><div><div><div>4</div></div><div><span>0 1 2 3 4 5 6 7 9 10 ...</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在最后补充异或<code>nums.length</code>，恰好能消除掉最后一个<code>nums[i]</code>，这样剩下的就是缺失的数字了。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>missingNumber</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> result </span><span>^</span><span> i </span><span>^</span><span> nums[i];</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// nums.length is exactly the last nums[i]</span></div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span><span> result </span><span>^</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>第二种方法，因为缺失了一个数，导致数本身的和会大于等于下标之和。因此，令初始结果为最大数，累加所有的下标之和，减去所有数之和，最终会得到缺失的数。这种方法只能在不造成溢出的情况下使用。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>missingNumber</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>sum </span><span>+=</span><span> i </span><span>-</span><span> nums[i];</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span>        </span><span>return</span><span> sum;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>269. Alien Dictionary<a href="#269-alien-dictionary"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/alien-dictionary/" target="_blank">https://leetcode.com/problems/alien-dictionary/</a></p><hr /><p>构建二维邻接矩阵，按照相邻单词相同下标的字母顺序构建边，输入到邻接矩阵中；再使用DFS遍历邻接矩阵得到遍历顺序。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>final</span><span> </span><span>int</span><span> N </span><span><span>=</span><span> </span></span><span>26</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>alienOrder</span><span>(</span><span>String</span><span><span>[] </span><span>words</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>// words[i+1:] order is unclear</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>words</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span> (words[i].</span><span>length</span><span><span>() </span><span>&gt;</span><span> words[i</span><span>+</span></span><span>1</span><span>].</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> words[i].</span></span><span>startsWith</span><span><span>(words[i</span><span>+</span></span><span>1</span><span>])) {</span></div></div><div><div><div>8</div></div><div><span>                </span><span>return</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// adjacency matrix</span></div></div><div><div><div>13</div></div><div><span>        </span><span>boolean</span><span><span>[][] </span><span>adj</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span>[N][N];</span></div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>visited</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[N];</span></div></div><div><div><div>15</div></div><div><span>        </span><span>buildGraph</span><span>(words, adj, visited);</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> N; i++) {</span></span></div></div><div><div><div>19</div></div><div><span>            </span><span>if</span><span><span> (visited[i] </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span><span>!</span></span><span>dfs</span><span>(adj, visited, sb, i)) {</span></div></div><div><div><div>20</div></div><div><span>                </span><span>return</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>reverse</span><span>().</span><span>toString</span><span>();</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>buildGraph</span><span>(</span><span>String</span><span><span>[] </span><span>words</span><span>, </span></span><span>boolean</span><span><span>[][] </span><span>adj</span><span>, </span></span><span>int</span><span><span>[] </span><span>visited</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>28</div></div><div><span>        </span><span>// -1 = not existed</span></div></div><div><div><div>29</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span><span>(visited, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>words</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>32</div></div><div><span>            </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> words[i].</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>visited[c </span><span>-</span><span> </span><span>'a'</span><span><span>] </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>37</div></div><div><span>                </span><span>// for characters of same indices, form an edge in matrix</span></div></div><div><div><div>38</div></div><div><span>                </span><span>String</span><span><span> </span><span>w1</span><span> </span></span><span><span>=</span><span> words[i </span><span>-</span><span> </span></span><span>1</span><span><span>], w2 </span><span>=</span><span> words[i];</span></span></div></div><div><div><div>39</div></div><div><span>                </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span>(</span><span>w1</span><span>.</span><span>length</span><span>(), </span><span>w2</span><span>.</span><span>length</span><span>());</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> len; j++) {</span></span></div></div><div><div><div>42</div></div><div><span>                    </span><span>char</span><span><span> </span><span>c1</span><span> </span></span><span><span>=</span><span> </span></span><span>w1</span><span>.</span><span>charAt</span><span><span>(j), c2 </span><span>=</span><span> </span></span><span>w2</span><span>.</span><span>charAt</span><span>(j);</span></div></div><div><div><div>43</div></div><div><span>                    </span><span>if</span><span><span> (c1 </span><span>!=</span><span> c2) {</span></span></div></div><div><div><div>44</div></div><div><span><span>                        </span></span><span>adj[c1 </span><span>-</span><span> </span><span>'a'</span><span><span>][c2 </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>45</div></div><div><span>                        </span><span>break</span><span>;</span></div></div><div><div><div>46</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>dfs</span><span>(</span><span>boolean</span><span><span>[][] </span><span>adj</span><span>, </span></span><span>int</span><span><span>[] </span><span>visited</span><span>, </span></span><span>StringBuilder</span><span><span> </span><span>sb</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>53</div></div><div><span>        </span><span>// 1 = visiting</span></div></div><div><div><div>54</div></div><div><span><span>        </span></span><span>visited[i] </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> N; j++) {</span></span></div></div><div><div><div>57</div></div><div><span>            </span><span>// connected</span></div></div><div><div><div>58</div></div><div><span>            </span><span>if</span><span> (adj[i][j]) {</span></div></div><div><div><div>59</div></div><div><span>                </span><span>// 1 =&gt; 1, cycle</span></div></div><div><div><div>60</div></div><div><span>                </span><span>if</span><span><span> (visited[j] </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>61</div></div><div><span>                     </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>62</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>63</div></div><div>
</div></div><div><div><div>64</div></div><div><span>                </span><span>// 0 = unvisited, and must need to find another unvisited node</span></div></div><div><div><div>65</div></div><div><span>                </span><span>if</span><span><span> (visited[j] </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span><span>!</span></span><span>dfs</span><span>(adj, visited, sb, j)) {</span></div></div><div><div><div>66</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>67</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>68</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>69</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>70</div></div><div>
</div></div><div><div><div>71</div></div><div><span>        </span><span>// 2 = visited</span></div></div><div><div><div>72</div></div><div><span><span>        </span></span><span>visited[i] </span><span>=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>73</div></div><div><span>        </span><span>sb</span><span>.</span><span>append</span><span>((</span><span>char</span><span><span>) (i </span><span>+</span><span> </span></span><span>'a'</span><span>));</span></div></div><div><div><div>74</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>75</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>76</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>270. Closest Binary Search Tree Value<a href="#270-closest-binary-search-tree-value"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/closest-binary-search-tree-value/" target="_blank">https://leetcode.com/problems/closest-binary-search-tree-value/</a></p><hr /><p>存储一个最接近<code>target</code>的变量，再根据节点值的大小调整遍历的方向。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>closestValue</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>, </span></span><span>double</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>root</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>while</span><span><span> (root </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>if</span><span> (</span><span>Math</span><span>.</span><span>abs</span><span><span>(result </span><span>-</span><span> target) </span><span>&gt;</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span>(</span><span>root</span><span>.</span><span>val</span><span><span> </span><span>-</span><span> target)) {</span></span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>root</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>root </span><span>=</span><span> (</span><span>root</span><span>.</span><span>val</span><span><span> </span><span>&gt;</span><span> target) </span></span><span>?</span><span> </span><span>root</span><span>.</span><span>left</span><span> </span><span>:</span><span> </span><span>root</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>271. Encode and Decode Strings<a href="#271-encode-and-decode-strings"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/encode-and-decode-strings/" target="_blank">https://leetcode.com/problems/encode-and-decode-strings/</a></p><hr /><p>编码时，在输入的每一个字符串前加入当前字符串的长度，并用<code>*</code>号间隔。解码时根据长度截取<code>*</code>之后的子字符串。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Codec</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>// Encodes a list of strings to a single string.</span></div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>encode</span><span>(</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>strs</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>s</span><span> </span></span><span>:</span><span> strs) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>// s.length() + '*' + s</span></div></div><div><div><div>9</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>s</span><span>.</span><span>length</span><span>()).</span><span>append</span><span>(</span><span>'*'</span><span>);</span></div></div><div><div><div>10</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(s);</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span>// Decodes a single string to a list of strings.</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>decode</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span> </span><span>idx</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>21</div></div><div><span>        </span><span>while</span><span><span> (idx </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>// first index of *</span></div></div><div><div><div>23</div></div><div><span>            </span><span>int</span><span><span> </span><span>pos</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>indexOf</span><span>(</span><span>'*'</span><span>, idx);</span></div></div><div><div><div>24</div></div><div><span>            </span><span>int</span><span><span> </span><span>size</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>valueOf</span><span>(</span><span>s</span><span>.</span><span>substring</span><span>(idx, pos));</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>            </span><span>// next index of  *</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>idx </span><span>=</span><span> pos </span><span>+</span><span> size </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>28</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>s</span><span>.</span><span>substring</span><span><span>(pos </span><span>+</span><span> </span></span><span>1</span><span>, idx));</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>272. Closest Binary Search Tree Value II<a href="#272-closest-binary-search-tree-value-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/closest-binary-search-tree-value-ii/" target="_blank">https://leetcode.com/problems/closest-binary-search-tree-value-ii/</a></p><hr /><p>使用一个LinkedList作为队列，使用中序遍历（保证遍历的元素值从小到大），当队列中的元素数量达到<code>k</code>时检查当前元素是否更加接近<code>target</code>，没有就直接返回，有的话将首个元素踢掉。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>closestKValues</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>, </span></span><span>double</span><span><span> </span><span>target</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>LinkedList</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>helper</span><span>(result, root, target, k);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>helper</span><span>(</span><span>LinkedList</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>node</span><span>, </span></span><span>double</span><span><span> </span><span>target</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>// in-order traverse</span></div></div><div><div><div>29</div></div><div><span>        </span><span>helper</span><span>(result, </span><span>node</span><span>.</span><span>left</span><span>, target, k);</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>// if already k elements in result, remove first element</span></div></div><div><div><div>32</div></div><div><span>        </span><span>// since we use in-order element, we can ensure that first element is the smallest and has max difference with current</span></div></div><div><div><div>33</div></div><div><span>        </span><span>if</span><span> (</span><span>result</span><span>.</span><span>size</span><span><span>() </span><span>==</span><span> k) {</span></span></div></div><div><div><div>34</div></div><div><span>            </span><span>if</span><span> (</span><span>Math</span><span>.</span><span>abs</span><span><span>(target </span><span>-</span><span> </span></span><span>node</span><span>.</span><span>val</span><span><span>) </span><span>&lt;</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(target </span><span>-</span><span> </span></span><span>result</span><span>.</span><span>peekFirst</span><span>())) {</span></div></div><div><div><div>35</div></div><div><span>                </span><span>result</span><span>.</span><span>removeFirst</span><span>();</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>37</div></div><div><span>                </span><span>return</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>42</div></div><div><span>        </span><span>helper</span><span>(result, </span><span>node</span><span>.</span><span>right</span><span>, target, k);</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>273. Integer to English Words<a href="#273-integer-to-english-words"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/integer-to-english-words/" target="_blank">https://leetcode.com/problems/integer-to-english-words/</a></p><hr /><p>默写出0-20对应的英文单词，以及0-100中所有的整十数的英文单词。由于限定了输入的范围不会超过2147483647，因此需要考虑6组范围：</p><ul>
<li>0 - 19，直接调用20以内的单词</li>
<li>20 - 99，十位数调用整十数，个位数调用0-20</li>
<li>100 - 999，分割后2位数和其余位数，用”Hundred”衔接</li>
<li>1,000 - 999,999，分割后3位数和其余位数，用”Thousand”衔接</li>
<li>1,000,000 - 999,999,999，分割后6位数和其余位数，用”Million”衔接</li>
<li>1,000,000,000，分割后9位数和其余位数，用”Billion”衔接</li>
</ul><p>核心思路就是不断将大数变小，只直接处理小于100的数字，更大的数字按照相应单位进行拆分。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>final</span><span> </span><span>String</span><span>[] belowTwenty </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>String</span><span>[] {</span><span>""</span><span><span>,</span><span> </span></span><span>"One"</span><span><span>,</span><span> </span></span><span>"Two"</span><span><span>,</span><span> </span></span><span>"Three"</span><span><span>,</span><span> </span></span><span>"Four"</span><span><span>,</span><span> </span></span><span>"Five"</span><span><span>,</span><span> </span></span><span>"Six"</span><span><span>,</span><span> </span></span><span>"Seven"</span><span><span>,</span><span> </span></span><span>"Eight"</span><span><span>,</span><span> </span></span><span>"Nine"</span><span><span>,</span><span> </span></span><span>"Ten"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>                                                       </span><span>"Eleven"</span><span><span>,</span><span> </span></span><span>"Twelve"</span><span><span>,</span><span> </span></span><span>"Thirteen"</span><span><span>,</span><span> </span></span><span>"Fourteen"</span><span><span>,</span><span> </span></span><span>"Fifteen"</span><span><span>,</span><span> </span></span><span>"Sixteen"</span><span><span>,</span><span> </span></span><span>"Seventeen"</span><span><span>,</span><span> </span></span><span>"Eighteen"</span><span><span>,</span><span> </span></span><span>"Nineteen"</span><span><span>}</span><span>;</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>private</span><span> </span><span>final</span><span> </span><span>String</span><span>[] tens </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>String</span><span>[] {</span><span>""</span><span><span>,</span><span> </span></span><span>"Ten"</span><span><span>,</span><span> </span></span><span>"Twenty"</span><span><span>,</span><span> </span></span><span>"Thirty"</span><span><span>,</span><span> </span></span><span>"Forty"</span><span><span>,</span><span> </span></span><span>"Fifty"</span><span><span>,</span><span> </span></span><span>"Sixty"</span><span><span>,</span><span> </span></span><span>"Seventy"</span><span><span>,</span><span> </span></span><span>"Eighty"</span><span><span>,</span><span> </span></span><span>"Ninety"</span><span><span>}</span><span>;</span></span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>numberToWords</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>return</span><span><span> (num </span><span>==</span><span> </span></span><span>0</span><span>) </span><span>?</span><span> </span><span>"Zero"</span><span> </span><span>:</span><span> </span><span>helper</span><span>(num);</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span>private</span><span> </span><span>String</span><span> </span><span>helper</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>String</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>String</span><span>();</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (num </span><span>&lt;</span><span> </span></span><span>20</span><span>) {</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> belowTwenty[num];</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (num </span><span>&lt;</span><span> </span></span><span>100</span><span>) {</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> tens[num </span><span>/</span><span> </span><span>10</span><span><span>] </span><span>+</span><span> </span></span><span>" "</span><span><span> </span><span>+</span><span> belowTwenty[num </span><span>%</span><span> </span></span><span>10</span><span>];</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (num </span><span>&lt;</span><span> </span></span><span>1000</span><span>) {</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>helper</span><span><span>(num </span><span>/</span><span> </span></span><span>100</span><span><span>) </span><span>+</span><span> </span></span><span>" Hundred "</span><span><span> </span><span>+</span><span> </span></span><span>helper</span><span><span>(num </span><span>%</span><span> </span></span><span>100</span><span>);</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (num </span><span>&lt;</span><span> </span></span><span>1000000</span><span>) {</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>helper</span><span><span>(num </span><span>/</span><span> </span></span><span>1000</span><span><span>) </span><span>+</span><span> </span></span><span>" Thousand "</span><span><span> </span><span>+</span><span> </span></span><span>helper</span><span><span>(num </span><span>%</span><span> </span></span><span>1000</span><span>);</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (num </span><span>&lt;</span><span> </span></span><span>1000000000</span><span>) {</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>helper</span><span><span>(num</span><span>/</span></span><span>1000000</span><span><span>) </span><span>+</span><span> </span></span><span>" Million "</span><span><span> </span><span>+</span><span>  </span></span><span>helper</span><span><span>(num </span><span>%</span><span> </span></span><span>1000000</span><span>);</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>helper</span><span><span>(num</span><span>/</span></span><span>1000000000</span><span><span>) </span><span>+</span><span> </span></span><span>" Billion "</span><span><span> </span><span>+</span><span> </span></span><span>helper</span><span><span>(num </span><span>%</span><span> </span></span><span>1000000000</span><span>);</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> </span><span>result</span><span>.</span><span>trim</span><span>();</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>274. H-Index<a href="#274-h-index"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/h-index/" target="_blank">https://leetcode.com/problems/h-index/</a></p><hr /><p>构造一个长度为总论文篇数 + 1的桶，每个桶的索引是论文的引用次数<code>i</code>，桶内存放着引用次数为<code>i</code>的论文篇数。</p><p>遍历所有论文，如果某篇论文引用次数超过总论文篇数，累加到最后一个桶；否则，按照次数索引累加相应的桶。完成后，从后向前遍历每个桶，并且累加桶里的值。如果累加值大于等于当前桶的索引，说明发现了h-index。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>hIndex</span><span>(</span><span>int</span><span><span>[] </span><span>citations</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (citations </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>citations</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// total paper count</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>citations</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// bucket[i] means count of paper with citation i</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>buckets</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[len </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> citations) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>// if one paper's citation exceeds total paper count, sum up to last bucket</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span><span> (c </span><span>&gt;=</span><span> len) {</span></span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>buckets[len]++;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>buckets[c]++;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// search backwards to find the largest h-index</span></div></div><div><div><div>23</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>24</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> len; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>count </span><span>+=</span><span> buckets[i];</span></div></div><div><div><div>26</div></div><div><span>            </span><span>if</span><span><span> (count </span><span>&gt;=</span><span> i) {</span></span></div></div><div><div><div>27</div></div><div><span>                </span><span>return</span><span> i;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>275. H-Index II<a href="#275-h-index-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/h-index-ii/" target="_blank">https://leetcode.com/problems/h-index-ii/</a></p><hr /><p>因为<code>citations</code>已经排好序了，所以直接使用二分搜索，如果<code>mid</code>索引的引用次数大于篇数，说明引用次数设定的过大，因此<code>right</code>取<code>mid</code>左侧；反之<code>left</code>取<code>mid</code>右侧。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>hIndex</span><span>(</span><span>int</span><span><span>[] </span><span>citations</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (citations </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>citations</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>citations</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>// len - mid: have at least h citations</span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span><span> (citations[mid] </span><span>&gt;=</span><span> (len </span><span>-</span><span> mid)) {</span></span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span><span> len </span><span>-</span><span> left;</span></span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>276. Paint Fence<a href="#276-paint-fence"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/paint-fence/" target="_blank">https://leetcode.com/problems/paint-fence/</a></p><hr /><p>考虑第<code>n</code>个<code>post</code>的染色数量，有两种情况：</p><ol>
<li>与第<code>n-1</code>个不一致。任选和第<code>n-1</code>个<code>post</code>不同的颜色即可</li>
<li>与第<code>n-1</code>个一致，那么第<code>n-1</code>个必须和第<code>n-2</code>个<code>post</code>颜色不一致，问题转化为当前<code>post</code>与第<code>n-2</code>个不一致的问题</li>
</ol><p>因此综合而言，如果使用动态规划，<code>dp[i]</code>依赖于<code>dp[i-1]</code>和<code>dp[i-2]</code>的值。不管是哪一种情况，都有<code>k-1</code>种其他颜色可选，因此总和就是<code>(dp[i-1] + dp[i-2]) * (k-1)</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>numWays</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>// no posts</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>// one post and k colors</span></div></div><div><div><div>8</div></div><div><span>            </span><span>return</span><span> k;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>// two posts, each has k colors</span></div></div><div><div><div>11</div></div><div><span>            </span><span>return</span><span><span> k </span><span>*</span><span> k;</span></span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[n</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>dp[</span><span>1</span><span><span>] </span><span>=</span><span> k;</span></span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>dp[</span><span>2</span><span><span>] </span><span>=</span><span> k </span><span>*</span><span> k;</span></span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>3</span><span><span>; i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>dp[i] </span><span>=</span><span> (dp[i</span><span>-</span><span>1</span><span><span>] </span><span>+</span><span> dp[i</span><span>-</span></span><span>2</span><span><span>]) </span><span>*</span><span> (k</span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> dp[n];</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>277. Find the Celebrity<a href="#277-find-the-celebrity"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-the-celebrity/" target="_blank">https://leetcode.com/problems/find-the-celebrity/</a></p><hr /><p>使用两次循环，第一次循环找出名人的候选，即如果<code>candidate</code>认识<code>i</code>，则把<code>i</code>换成新的<code>candidate</code>。第二次循环，再检查这个选出来的<code>candidate</code>是否认识号数在他之前的人。注意，第二次循环对于<code>candidate</code>是0的情况并不适用，因此需要额外讨论<code>candidate</code>为0的情况。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/* The knows API is defined in the parent class Relation.</span></div></div><div><div><div>2</div></div><div><span><span>      </span></span><span>boolean knows(int a, int b); */</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>extends</span><span><span> </span><span>Relation</span><span> </span></span><span>{</span></div></div><div><div><div>5</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findCelebrity</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>// only two people and they don't know about each other</span></div></div><div><div><div>7</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>2</span><span><span> </span><span>&amp;&amp;</span><span> </span><span>!</span></span><span>knows</span><span>(</span><span>0</span><span>, </span><span>1</span><span><span>) </span><span>&amp;&amp;</span><span> </span><span>!</span></span><span>knows</span><span>(</span><span>1</span><span>, </span><span>0</span><span>)) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>candidate</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>// find potential celebrity candidate</span></div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span> (</span><span>knows</span><span>(candidate, i)) {</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>candidate </span><span>=</span><span> i;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>// additionally judge 0-th person</span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span><span> (candidate </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>22</div></div><div><span>                </span><span>if</span><span><span> (</span><span>!</span></span><span>knows</span><span>(i, candidate)) {</span></div></div><div><div><div>23</div></div><div><span>                    </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// if this celebrity candidate knows someone,</span></div></div><div><div><div>31</div></div><div><span>        </span><span>// or somebody doesn't know him, exclude him</span></div></div><div><div><div>32</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> candidate; i++) {</span></span></div></div><div><div><div>33</div></div><div><span>            </span><span>if</span><span> (</span><span>knows</span><span><span>(candidate, i) </span><span>||</span><span> </span><span>!</span></span><span>knows</span><span>(i, candidate)) {</span></div></div><div><div><div>34</div></div><div><span>                </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> candidate;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>278. First Bad Version<a href="#278-first-bad-version"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/first-bad-version/" target="_blank">https://leetcode.com/problems/first-bad-version/</a></p><hr /><p>问题需要找出最小的bad version，正好对应左边界场景下的二分查找问题。如果某个版本号不是bad version，就向上搜索版本号；反之向下搜索，看是否还有更小的版本号也是bad version。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/* The isBadVersion API is defined in the parent class VersionControl.</span></div></div><div><div><div>2</div></div><div><span><span>      </span></span><span>boolean isBadVersion(int version); */</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>extends</span><span><span> </span><span>VersionControl</span><span> </span></span><span>{</span></div></div><div><div><div>5</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>firstBadVersion</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>, right </span><span>=</span><span> n;</span></span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span> (</span><span>isBadVersion</span><span><span>(mid) </span><span>==</span><span> </span></span><span>false</span><span>) {</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span> left;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>279. Perfect Squares<a href="#279-perfect-squares"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/perfect-squares/" target="_blank">https://leetcode.com/problems/perfect-squares/</a></p><hr /><p>使用动态规划思想，记录每个数中最少可用几个完全平方数表示。从1开始到<code>sqrt(i)</code>，尽可能地填入已知的最大完全平方数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>numSquares</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[n </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span>(dp, </span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>);</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>*</span><span> i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>dp[i </span><span>*</span><span> i] </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>11</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>+</span><span> j </span><span>*</span><span> j </span><span>&lt;=</span><span> n; j++) {</span></span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>dp[i </span><span>+</span><span> j </span><span>*</span><span> j] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(dp[i </span><span>+</span><span> j </span><span>*</span><span> j], dp[i] </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> dp[n];</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>280. Wiggle Sort<a href="#280-wiggle-sort"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/wiggle-sort/" target="_blank">https://leetcode.com/problems/wiggle-sort/</a></p><hr /><p>第一个数不动，之后的数按照下标奇偶，如果奇数下标的数比前一个数小，或是偶数下标的数比前一个数大，则交换当前数和前一个数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>wiggleSort</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> nums[i</span><span>-</span></span><span>1</span><span><span>] </span><span>&gt;</span><span> nums[i]) {</span></span></div></div><div><div><div>6</div></div><div><span>                </span><span>// odd index must be greater than previous one</span></div></div><div><div><div>7</div></div><div><span>                </span><span>swap</span><span><span>(nums, i</span><span>-</span></span><span>1</span><span>, i);</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (i </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> i </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> nums[i</span><span>-</span></span><span>1</span><span><span>] </span><span>&lt;</span><span> nums[i]) {</span></span></div></div><div><div><div>9</div></div><div><span>                </span><span>// even index (except 0) must be samller than previous one</span></div></div><div><div><div>10</div></div><div><span>                </span><span>swap</span><span><span>(nums, i</span><span>-</span></span><span>1</span><span>, i);</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>swap</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> nums[i];</span></span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>nums[i] </span><span>=</span><span> nums[j];</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>nums[j] </span><span>=</span><span> temp;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>281. Zigzag Iterator<a href="#281-zigzag-iterator"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/zigzag-iterator/" target="_blank">https://leetcode.com/problems/zigzag-iterator/</a></p><hr /><p>将两个List的信息复制到全局变量中，同时引入两个指针变量用于标注当前遍历List的进度。必须时刻确保两个指针轮流前进，并且指针不能超出对应List的长度。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>ZigzagIterator</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>int</span><span> size1 </span><span><span>=</span><span> </span></span><span>0</span><span><span>,</span><span> size2 </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>int</span><span> ptr1 </span><span><span>=</span><span> </span></span><span>0</span><span><span>,</span><span> ptr2 </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> v1</span><span>,</span><span> v2</span></span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>    </span><span>public</span><span> </span><span>ZigzagIterator</span><span>(</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>v1</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>v2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>size1 </span><span>=</span><span> </span><span>v1</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>size2 </span><span>=</span><span> </span><span>v2</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>10</div></div><div><span>        </span><span>this</span><span>.</span><span>v1</span><span><span> </span><span>=</span><span> v1;</span></span></div></div><div><div><div>11</div></div><div><span>        </span><span>this</span><span>.</span><span>v2</span><span><span> </span><span>=</span><span> v2;</span></span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>next</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>15</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// 'zigzagly' moving ptr1 and ptr2 forward</span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (ptr1 </span><span>&lt;</span><span> ptr2 </span><span>&amp;&amp;</span><span> ptr1 </span><span>&lt;</span><span> size1) {</span></span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>v1</span><span>.</span><span>get</span><span>(ptr1);</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>ptr1++;</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span><span> (ptr2 </span><span>&lt;</span><span> ptr1 </span><span>&amp;&amp;</span><span> ptr2 </span><span>&lt;</span><span> size2) {</span></span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>v2</span><span>.</span><span>get</span><span>(ptr2);</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>ptr2++;</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// one of the pointers reach the end, only moving other pointers</span></div></div><div><div><div>30</div></div><div><span>        </span><span>if</span><span><span> (ptr1 </span><span>&lt;</span><span> size1) {</span></span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>v1</span><span>.</span><span>get</span><span>(ptr1);</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>ptr1++;</span></div></div><div><div><div>33</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>        </span><span>if</span><span><span> (ptr2 </span><span>&lt;</span><span> size2) {</span></span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>v2</span><span>.</span><span>get</span><span>(ptr2);</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>ptr2++;</span></div></div><div><div><div>38</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>hasNext</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>45</div></div><div><span>        </span><span>// v1 unfinished, or v2 unfinished</span></div></div><div><div><div>46</div></div><div><span>        </span><span>return</span><span><span> (ptr1 </span><span>&lt;</span><span> size1 </span><span>||</span><span> ptr2 </span><span>&lt;</span><span> size2);</span></span></div></div><div><div><div>47</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>282. Expression Add Operators<a href="#282-expression-add-operators"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/expression-add-operators/" target="_blank">https://leetcode.com/problems/expression-add-operators/</a></p><hr /><p>使用dfs，抄录<code>num</code>的每一位到<code>exp</code>中，再分别用三种符号dfs尝试是否满足条件。注意处理首位为0（跳过）以及整数溢出（使用long)的情况。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> result</span></span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>char</span><span>[] num</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>char</span><span>[] exp</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>addOperators</span><span>(</span><span>String</span><span><span> </span><span>num</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>this</span><span>.</span><span>num</span><span><span> </span><span>=</span><span> </span></span><span>num</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>this</span><span>.</span><span>result</span><span><span> </span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>9</div></div><div><span>        </span><span>this</span><span>.</span><span>exp</span><span><span> </span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[</span><span>num</span><span>.</span><span>length</span><span><span>() </span><span>*</span><span> </span></span><span>2</span><span>];</span></div></div><div><div><div>10</div></div><div><span>        </span><span>dfs</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, target);</span></div></div><div><div><div>11</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span> </span><span>pos</span><span>, </span></span><span>int</span><span><span> </span><span>len</span><span>, </span></span><span>long</span><span><span> </span><span>prev</span><span>, </span></span><span>long</span><span><span> </span><span>curr</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>15</div></div><div><span>        </span><span>// finish whole string</span></div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span><span> (pos </span><span>==</span><span> </span></span><span>num</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span><span> (curr </span><span>==</span><span> target) {</span></span></div></div><div><div><div>18</div></div><div><span>                </span><span>// add current expression to result</span></div></div><div><div><div>19</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>String</span><span>(exp, </span><span>0</span><span>, len));</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>// record current position of num and expression</span></div></div><div><div><div>26</div></div><div><span>        </span><span>int</span><span><span> </span><span>s</span><span> </span></span><span><span>=</span><span> pos, l </span><span>=</span><span> len;</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>len++;</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>long</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>32</div></div><div><span>        </span><span>while</span><span><span> (pos </span><span>&lt;</span><span> </span></span><span>num</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>33</div></div><div><span>            </span><span>// first digit is 0, skipped</span></div></div><div><div><div>34</div></div><div><span>            </span><span>if</span><span><span> (num[s] </span><span>==</span><span> </span></span><span>'0'</span><span><span> </span><span>&amp;&amp;</span><span> pos </span><span>-</span><span> s </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>35</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>            </span><span>// calculation</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>n </span><span>=</span><span> n </span><span>*</span><span> </span><span>10</span><span><span> </span><span>+</span><span> (</span></span><span>int</span><span><span>)(num[pos] </span><span>-</span><span> </span></span><span>'0'</span><span>);</span></div></div><div><div><div>40</div></div><div><span>            </span><span>if</span><span><span> (n </span><span>&gt;</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>) {</span></div></div><div><div><div>41</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>            </span><span>// copy current position of num to expression</span></div></div><div><div><div>45</div></div><div><span><span>            </span></span><span>exp[len] </span><span>=</span><span> num[pos];</span></div></div><div><div><div>46</div></div><div><span><span>            </span></span><span>len++;</span></div></div><div><div><div>47</div></div><div><span><span>            </span></span><span>pos++;</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>            </span><span>// at the start, no current value, go to dfs straightly</span></div></div><div><div><div>50</div></div><div><span>            </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>51</div></div><div><span>                </span><span>dfs</span><span>(pos, len, n, n, target);</span></div></div><div><div><div>52</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>53</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>54</div></div><div>
</div></div><div><div><div>55</div></div><div><span>            </span><span>// try '+', '-', '*'</span></div></div><div><div><div>56</div></div><div><span><span>            </span></span><span>exp[l] </span><span>=</span><span> </span><span>'+'</span><span>;</span></div></div><div><div><div>57</div></div><div><span>            </span><span>dfs</span><span><span>(pos, len, n, curr </span><span>+</span><span> n, target);</span></span></div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span><span>            </span></span><span>exp[l] </span><span>=</span><span> </span><span>'-'</span><span>;</span></div></div><div><div><div>60</div></div><div><span>            </span><span>dfs</span><span><span>(pos, len, </span><span>-</span><span>n, curr </span><span>-</span><span> n, target);</span></span></div></div><div><div><div>61</div></div><div>
</div></div><div><div><div>62</div></div><div><span><span>            </span></span><span>exp[l] </span><span>=</span><span> </span><span>'*'</span><span>;</span></div></div><div><div><div>63</div></div><div><span>            </span><span>dfs</span><span><span>(pos, len, prev </span><span>*</span><span> n, curr </span><span>-</span><span> prev </span><span>+</span><span> prev </span><span>*</span><span> n, target);</span></span></div></div><div><div><div>64</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>65</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>66</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>283. Move Zeroes<a href="#283-move-zeroes"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/move-zeroes/" target="_blank">https://leetcode.com/problems/move-zeroes/</a></p><hr /><p>遍历数组，将所有非0的数按顺序填到数组最前；之后的部分补0即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>moveZeroes</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>if</span><span><span> (nums[i] </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>nums[count] </span><span>=</span><span> nums[i];</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>count++;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> count; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>nums[i] </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>284. Peeking Iterator<a href="#284-peeking-iterator"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/peeking-iterator/" target="_blank">https://leetcode.com/problems/peeking-iterator/</a></p><hr /><p>构造函数里，需要先检查迭代器是否为空（含有下一个元素）。</p><p>使用<code>isIterationFinished</code>变量，记录目前迭代器是否访问完毕；在已访问完的情况下调用<code>next()</code>，需要抛出异常。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// Java Iterator interface reference:</span></div></div><div><div><div>2</div></div><div><span>// https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>import</span><span> </span><span>java.util.NoSuchElementException</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>class</span><span><span> </span><span>PeekingIterator</span><span> </span></span><span>implements</span><span><span> </span><span>Iterator</span><span>&lt;</span><span>Integer</span><span>&gt;</span><span> </span></span><span>{</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>Integer</span><span> next</span><span>;</span></div></div><div><div><div>9</div></div><div><span>    </span><span>Iterator</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> iter</span></span><span>;</span></div></div><div><div><div>10</div></div><div><span>    </span><span>boolean</span><span> isIterationFinished </span><span><span>=</span><span> </span></span><span>false</span><span><span>;</span><span> </span></span><span>// whether finished iterating current iterator</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>PeekingIterator</span><span>(</span><span>Iterator</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>iterator</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>// initialize any member here.</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>iter </span><span>=</span><span> iterator;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// pre-set 'next' pointer and 'isIterationFinished' flag</span></div></div><div><div><div>17</div></div><div><span>        </span><span>if</span><span> (</span><span>iter</span><span>.</span><span>hasNext</span><span>()) {</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>next </span><span>=</span><span> </span><span>iter</span><span>.</span><span>next</span><span>();</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>isIterationFinished </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span>// Returns the next element in the iteration without advancing the iterator.</span></div></div><div><div><div>25</div></div><div><span>    </span><span>public</span><span> </span><span>Integer</span><span> </span><span>peek</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> next;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>    </span><span>// hasNext() and next() should behave the same as in the Iterator interface.</span></div></div><div><div><div>30</div></div><div><span>    </span><span>// Override them if needed.</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>@</span><span>Override</span></div></div><div><div><div>32</div></div><div><span>    </span><span>public</span><span> </span><span>Integer</span><span> </span><span>next</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>33</div></div><div><span>        </span><span>if</span><span> (isIterationFinished) {</span></div></div><div><div><div>34</div></div><div><span>            </span><span>throw</span><span> </span><span>new</span><span> </span><span>NoSuchElementException</span><span>();</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>        </span><span>Integer</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> next;</span></span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>// need to set 'next' pointer and 'isIterationFinished' flag before return</span></div></div><div><div><div>39</div></div><div><span>        </span><span>if</span><span> (</span><span>iter</span><span>.</span><span>hasNext</span><span>()) {</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>next </span><span>=</span><span> </span><span>iter</span><span>.</span><span>next</span><span>();</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>isIterationFinished </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>43</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>46</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>@</span><span>Override</span></div></div><div><div><div>49</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>hasNext</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>50</div></div><div><span>        </span><span>return</span><span><span> </span><span>!</span><span>isIterationFinished;</span></span></div></div><div><div><div>51</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>52</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>285. Inorder Successor in BST<a href="#285-inorder-successor-in-bst"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/inorder-successor-in-bst/" target="_blank">https://leetcode.com/problems/inorder-successor-in-bst/</a></p><hr /><p>最近的继承者要么是<code>p</code>的右子树上的最小值，要么是<code>p</code>的父节点。</p><p>当<code>root</code>的值比<code>p</code>小时，不断递归调用<code>root</code>的右子，向右查找最近的successor；否则，调用<code>root</code>的左子进行判断，如果存在左子，<code>root</code>的左子肯定比<code>root</code>的小，但又比<code>root</code>的父节点大，因此返回<code>root</code>的左子；如果不存在左子，说明<code>root</code>本身就已经是以<code>root</code>为根的树上能获取到的最小节点（再小就需要返回上一级父节点），因此返回<code>root</code>本身。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode(int x) { val = x; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>10</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>11</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>inorderSuccessor</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>p</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// start to search in left subtree</span></div></div><div><div><div>17</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>val</span><span><span> </span><span>&lt;=</span><span> </span></span><span>p</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>return</span><span> </span><span>inorderSuccessor</span><span>(</span><span>root</span><span>.</span><span>right</span><span>, p);</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>20</div></div><div><span>            </span><span>// may be the smallest node in left subtree, otherwise root itself</span></div></div><div><div><div>21</div></div><div><span>            </span><span>TreeNode</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>inorderSuccessor</span><span>(</span><span>root</span><span>.</span><span>left</span><span>, p);</span></div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span><span> (left </span><span>!=</span><span> </span></span><span>null</span><span>) </span><span>?</span><span> left </span><span>:</span><span> root;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>286. Walls and Gates<a href="#286-walls-and-gates"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/walls-and-gates/" target="_blank">https://leetcode.com/problems/walls-and-gates/</a></p><hr /><p>DFS遍历数组，发现一个门时开始DFS，更新整个数组的值。DFS的过程中，迭代的深度即表示当前方格到门的距离。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>wallsAndGates</span><span>(</span><span>int</span><span><span>[][] </span><span>rooms</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (rooms </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>rooms</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> rooms[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>rooms</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> rooms[</span></span><span>0</span><span>].</span><span>length</span><span>; j++) {</span></div></div><div><div><div>9</div></div><div><span>                </span><span>// start from a gate to update the whole matrix</span></div></div><div><div><div>10</div></div><div><span>                </span><span>if</span><span><span> (rooms[i][j] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>                    </span><span>dfs</span><span>(rooms, i, j, </span><span>0</span><span>);</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span>[][] </span><span>rooms</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>, </span></span><span>int</span><span><span> </span><span>depth</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>// set current depth of route</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>rooms[i][j] </span><span>=</span><span> depth;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span><span> (i </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> rooms[i </span><span>-</span><span> </span></span><span>1</span><span><span>][j] </span><span>&gt;</span><span> depth </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>dfs</span><span><span>(rooms, i </span><span>-</span><span> </span></span><span>1</span><span><span>, j, depth </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>if</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>rooms</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> rooms[i </span><span>+</span><span> </span></span><span>1</span><span><span>][j] </span><span>&gt;</span><span> depth </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>28</div></div><div><span>            </span><span>dfs</span><span><span>(rooms, i </span><span>+</span><span> </span></span><span>1</span><span><span>, j, depth </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>if</span><span><span> (j </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> rooms[i][j </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>&gt;</span><span> depth </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>32</div></div><div><span>            </span><span>dfs</span><span><span>(rooms, i, j </span><span>-</span><span> </span></span><span>1</span><span><span>, depth </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>if</span><span><span> (j </span><span>&lt;</span><span> rooms[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> rooms[i][j </span><span>+</span><span> </span></span><span>1</span><span><span>] </span><span>&gt;</span><span> depth </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>36</div></div><div><span>            </span><span>dfs</span><span><span>(rooms, i, j </span><span>+</span><span> </span></span><span>1</span><span><span>, depth </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>287. Find the Duplicate Number<a href="#287-find-the-duplicate-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-the-duplicate-number/" target="_blank">https://leetcode.com/problems/find-the-duplicate-number/</a></p><hr /><p>与此前的Linked List Cycle II思路相近，仍旧使用快慢指针，慢指针每次跳转一位，快指针每次跳转两位。经过相同次数跳转后，快慢指针将指向同一数字。这时，快指针已经比慢指针多完成了一个cycle的循环。从相遇点到cycle入口到距离恰好等于慢指针此前移动的次数：</p><p>因此，将慢指针放回起点，之后让两个指针等速跳转，慢指针重走一遍来时的路，快指针再走一遍cycle，相遇点就是环的入口，即重复的数字。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findDuplicate</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>slow</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, fast </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>while</span><span><span> (fast </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> nums[fast] </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>slow </span><span>=</span><span> nums[slow];</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>fast </span><span>=</span><span> nums[ nums[fast] ];</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>            </span><span>if</span><span><span> (slow </span><span>==</span><span> fast) {</span></span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>slow </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div><span>                </span><span>while</span><span><span> (slow </span><span>!=</span><span> fast) {</span></span></div></div><div><div><div>12</div></div><div><span><span>                    </span></span><span>slow </span><span>=</span><span> nums[slow];</span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>fast </span><span>=</span><span> nums[fast];</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>                </span><span>return</span><span> slow;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>288. Unique Word Abbreviation<a href="#288-unique-word-abbreviation"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/unique-word-abbreviation/" target="_blank">https://leetcode.com/problems/unique-word-abbreviation/</a></p><hr /><p>使用一个map，保存缩略词作为key，可能的unique word作为value。当发现一个新缩略词时，将其作为key，同时将这个单词本身作为value保存进map中；而一旦发现了第二个具有相缩略词的单词时，这个单词肯定不是unique word，因此将这个缩略词对应的value设为空，等待之后是否还有其他单词补入。判断是否为unique word时，只需要检查其对应缩略词key是否能获取得到value即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>ValidWordAbbr</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>// only save the abbr key and potential unique word as value</span></div></div><div><div><div>4</div></div><div><span>    </span><span>Map</span><span>&lt;</span><span>String</span><span><span>,</span><span> </span></span><span>String</span><span><span>&gt;</span><span> wordAbbr </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>ValidWordAbbr</span><span>(</span><span>String</span><span><span>[] </span><span>dictionary</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>str</span><span> </span></span><span>:</span><span> dictionary) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>String</span><span><span> </span><span>abbr</span><span> </span></span><span><span>=</span><span> </span></span><span>getAbbreviation</span><span>(str);</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>wordAbbr</span><span>.</span><span>containsKey</span><span>(abbr)) {</span></div></div><div><div><div>11</div></div><div><span>                </span><span>// a new key</span></div></div><div><div><div>12</div></div><div><span>                </span><span>wordAbbr</span><span>.</span><span>put</span><span>(abbr, str);</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}  </span><span>else</span><span> </span><span>if</span><span><span> (</span><span>!</span></span><span>wordAbbr</span><span>.</span><span>get</span><span>(abbr).</span><span>equals</span><span>(str)) {</span></div></div><div><div><div>14</div></div><div><span>                </span><span>// eliminate a pair of repeating words</span></div></div><div><div><div>15</div></div><div><span>                </span><span>wordAbbr</span><span>.</span><span>put</span><span>(abbr, </span><span>""</span><span>);</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isUnique</span><span>(</span><span>String</span><span><span> </span><span>word</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>21</div></div><div><span>        </span><span>String</span><span><span> </span><span>abbr</span><span> </span></span><span><span>=</span><span> </span></span><span>getAbbreviation</span><span>(word);</span></div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>wordAbbr</span><span>.</span><span>containsKey</span><span>(abbr)) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> </span><span>wordAbbr</span><span>.</span><span>get</span><span>(abbr).</span><span>equals</span><span>(word);</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>    </span><span>private</span><span> </span><span>String</span><span> </span><span>getAbbreviation</span><span>(</span><span>String</span><span><span> </span><span>word</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>30</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>word</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>31</div></div><div><span>        </span><span>if</span><span><span> (len </span><span>&lt;</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>32</div></div><div><span>            </span><span>return</span><span> word;</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>return</span><span> </span><span>word</span><span>.</span><span>charAt</span><span>(</span><span>0</span><span><span>) </span><span>+</span><span> </span></span><span>String</span><span>.</span><span>valueOf</span><span><span>(len </span><span>-</span><span> </span></span><span>2</span><span><span>) </span><span>+</span><span> </span></span><span>word</span><span>.</span><span>charAt</span><span><span>(len </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>289. Game of Life<a href="#289-game-of-life"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/game-of-life/" target="_blank">https://leetcode.com/problems/game-of-life/</a></p><hr /><p>使用两位状态码表示一个节点的状态：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[2nd bit, 1st bit] = [next state, current state]</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>- 00  dead (next) &lt;- dead (current)</span></div></div><div><div><div>4</div></div><div><span>- 01  dead (next) &lt;- live (current)</span></div></div><div><div><div>5</div></div><div><span>- 10  live (next) &lt;- dead (current)</span></div></div><div><div><div>6</div></div><div><span>- 11  live (next) &lt;- live (current)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在统计周围方格的情况时，只需要判断1st bit的情况（和1取与）；而决定一格是否生存，只需要修改2nd bit即可。只要2nd bit为1（对应状态2或3），右移后下一回合这一格就是生存的。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>gameOfLife</span><span>(</span><span>int</span><span><span>[][] </span><span>board</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (board </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> board[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>board</span><span>.</span><span>length</span><span><span>, col </span><span>=</span><span> board[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> row; i++) {</span></span></div></div><div><div><div>9</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> col; j++) {</span></span></div></div><div><div><div>10</div></div><div><span>                </span><span>int</span><span><span> </span><span>lives</span><span> </span></span><span><span>=</span><span> </span></span><span>countLives</span><span>(board, row, col, i, j);</span></div></div><div><div><div>11</div></div><div><span>                </span><span>if</span><span><span> (board[i][j] </span><span>==</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> lives </span><span>&gt;=</span><span> </span></span><span>2</span><span><span> </span><span>&amp;&amp;</span><span> lives </span><span>&lt;=</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>                    </span><span>// lives on to the next generation</span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>board[i][j] </span><span>=</span><span> </span><span>3</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>                </span><span>if</span><span><span> (board[i][j] </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> lives </span><span>==</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>17</div></div><div><span>                    </span><span>// reproduction</span></div></div><div><div><div>18</div></div><div><span><span>                    </span></span><span>board[i][j] </span><span>=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>// shift to next state</span></div></div><div><div><div>24</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> row; i++) {</span></span></div></div><div><div><div>25</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> col; j++) {</span></span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>board[i][j] </span><span>&gt;&gt;=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>countLives</span><span>(</span><span>int</span><span><span>[][] </span><span>board</span><span>, </span></span><span>int</span><span><span> </span><span>row</span><span>, </span></span><span>int</span><span><span> </span><span>col</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>32</div></div><div><span>        </span><span>int</span><span><span> </span><span>lives</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>// count how many alive cells in 3*3 grids, and reduce self cell</span></div></div><div><div><div>35</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span><span>(i</span><span>-</span></span><span>1</span><span>, </span><span>0</span><span><span>); x </span><span>&lt;=</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span><span>(i</span><span>+</span></span><span>1</span><span><span>, row</span><span>-</span></span><span>1</span><span>); x++) {</span></div></div><div><div><div>36</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>y</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span><span>(j</span><span>-</span></span><span>1</span><span>, </span><span>0</span><span><span>); y </span><span>&lt;=</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span><span>(j</span><span>+</span></span><span>1</span><span><span>, col</span><span>-</span></span><span>1</span><span>); y++) {</span></div></div><div><div><div>37</div></div><div><span><span>                </span></span><span>lives </span><span>+=</span><span> board[x][y] </span><span>&amp;</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>lives </span><span>-=</span><span> board[i][j] </span><span>&amp;</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>        </span><span>return</span><span> lives;</span></div></div><div><div><div>44</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>290. Word Pattern<a href="#290-word-pattern"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/word-pattern/" target="_blank">https://leetcode.com/problems/word-pattern/</a></p><hr /><p>使用HashMap建立起&lt;字母，下标&gt;和&lt;单词，下标&gt;的对应，比较上一次字母、单词各自出现时对应的下标是否相等。注意两点：</p><ul>
<li><code>map.put()</code>返回插入前的value，可以直接用来比较，不需要再调用<code>map.containsKey()</code></li>
<li>Java的autoboxing机制，即JVM会缓存-128 ~ 127之间的整数，此时这两个整数对象可以简单用<code>==</code>比较值。如果循环中的<code>i</code>声明为int类型，而恰好遇到了很长的测试用例使得<code>i</code>超出了这个范围，比较就失效了。（值相等也返回false)</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>wordPattern</span><span>(</span><span>String</span><span><span> </span><span>pattern</span><span>, </span></span><span>String</span><span><span> </span><span>str</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>characters</span><span> </span></span><span><span>=</span><span> </span></span><span>pattern</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>words</span><span> </span></span><span><span>=</span><span> </span></span><span>str</span><span>.</span><span>split</span><span>(</span><span>" "</span><span>);</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// str and pattern must have same length</span></div></div><div><div><div>7</div></div><div><span>        </span><span>if</span><span> (</span><span>characters</span><span>.</span><span>length</span><span><span> </span><span>!=</span><span> </span></span><span>words</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>Map</span><span><span> </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>Integer</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>characters</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>// map.put() returns the value before inserting</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span> (</span><span>map</span><span>.</span><span>put</span><span><span>(characters[i], i) </span><span>!=</span><span> </span></span><span>map</span><span>.</span><span>put</span><span>(words[i], i)) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>291. Word Pattern II<a href="#291-word-pattern-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/word-pattern-ii/" target="_blank">https://leetcode.com/problems/word-pattern-ii/</a></p><hr /><p>使用回溯算法，用一个map保存<code>pattern</code>中每一个字母入口以及对应的字符串，再使用一个Set保存所有尝试过的字符串。逐个字母向前推进<code>pattern</code>和<code>str</code>，同时检查<code>str</code>中剩余的所有可能字符串，只要没有出现长度不合法或是模式不匹配，就dfs调用下一层检查。当<code>pattern</code>和<code>str</code>的指针同时达到结尾，说明匹配成功。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>wordPatternMatch</span><span>(</span><span>String</span><span><span> </span><span>pattern</span><span>, </span></span><span>String</span><span><span> </span><span>str</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>pattern</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>str</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span> (</span><span>pattern</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>str</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// string entry, string</span></div></div><div><div><div>11</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Character</span><span>, </span><span>String</span><span><span>&gt; </span><span>charToStr</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>12</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>visited</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> </span><span>findPatternMatch</span><span>(pattern, </span><span>0</span><span>, str, </span><span>0</span><span>, charToStr, visited);</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>findPatternMatch</span><span>(</span><span>String</span><span><span> </span><span>pattern</span><span>, </span></span><span>int</span><span><span> </span><span>pIndex</span><span>, </span></span><span>String</span><span><span> </span><span>str</span><span>, </span></span><span>int</span><span><span> </span><span>sIndex</span><span>, </span></span><span>Map</span><span>&lt;</span><span>Character</span><span>, </span><span>String</span><span><span>&gt; </span><span>charToStr</span><span>, </span></span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>visited</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>// one reaches the end, the other should also reaches</span></div></div><div><div><div>19</div></div><div><span>        </span><span>if</span><span><span> (pIndex </span><span>==</span><span> </span></span><span>pattern</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>20</div></div><div><span>            </span><span>return</span><span><span> sIndex </span><span>==</span><span> </span></span><span>str</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span><span> (sIndex </span><span>==</span><span> </span></span><span>str</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span><span> pIndex </span><span>==</span><span> </span></span><span>pattern</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>pattern</span><span>.</span><span>charAt</span><span>(pIndex);</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>if</span><span> (</span><span>charToStr</span><span>.</span><span>containsKey</span><span>(c)) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>String</span><span><span> </span><span>cs</span><span> </span></span><span><span>=</span><span> </span></span><span>charToStr</span><span>.</span><span>get</span><span>(c);</span></div></div><div><div><div>30</div></div><div><span>            </span><span>if</span><span> (</span><span>cs</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>str</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> sIndex </span><span>||</span><span> </span><span>!</span></span><span>cs</span><span>.</span><span>equals</span><span>(</span><span>str</span><span>.</span><span>substring</span><span><span>(sIndex, sIndex </span><span>+</span><span> </span></span><span>cs</span><span>.</span><span>length</span><span>()))) {</span></div></div><div><div><div>31</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>            </span><span>return</span><span> </span><span>findPatternMatch</span><span><span>(pattern, pIndex </span><span>+</span><span> </span></span><span>1</span><span><span>, str, sIndex </span><span>+</span><span> </span></span><span>cs</span><span>.</span><span>length</span><span>(), charToStr, visited);</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>int</span><span><span> </span><span>sRemain</span><span> </span></span><span><span>=</span><span> </span></span><span>str</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> sIndex;</span></span></div></div><div><div><div>37</div></div><div><span>        </span><span>int</span><span><span> </span><span>pRemain</span><span> </span></span><span><span>=</span><span> </span></span><span>pattern</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> pIndex </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>// try different string length</span></div></div><div><div><div>40</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; len </span><span>&lt;=</span><span> sRemain </span><span>-</span><span> pRemain; len++) {</span></span></div></div><div><div><div>41</div></div><div><span>            </span><span>String</span><span><span> </span><span>sub</span><span> </span></span><span><span>=</span><span> </span></span><span>str</span><span>.</span><span>substring</span><span><span>(sIndex, sIndex </span><span>+</span><span> len);</span></span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>            </span><span>// skip visited string</span></div></div><div><div><div>44</div></div><div><span>            </span><span>if</span><span> (</span><span>visited</span><span>.</span><span>contains</span><span>(sub)) {</span></div></div><div><div><div>45</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>46</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span>            </span><span>charToStr</span><span>.</span><span>put</span><span>(c, sub);</span></div></div><div><div><div>49</div></div><div><span>            </span><span>visited</span><span>.</span><span>add</span><span>(sub);</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>            </span><span>// dfs, try next character in pattern</span></div></div><div><div><div>52</div></div><div><span>            </span><span>if</span><span> (</span><span>findPatternMatch</span><span><span>(pattern, pIndex </span><span>+</span><span> </span></span><span>1</span><span><span>, str, sIndex </span><span>+</span><span> len, charToStr, visited)) {</span></span></div></div><div><div><div>53</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>54</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>            </span><span>charToStr</span><span>.</span><span>remove</span><span>(c);</span></div></div><div><div><div>57</div></div><div><span>            </span><span>visited</span><span>.</span><span>remove</span><span>(sub);</span></div></div><div><div><div>58</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>59</div></div><div>
</div></div><div><div><div>60</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>61</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>62</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>292. Nim Game<a href="#292-nim-game"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/nim-game/" target="_blank">https://leetcode.com/problems/nim-game/</a></p><hr /><p>如果石头个数是4的倍数，先手方拿任意<code>x</code>个，后方只需要拿<code>4-x</code>个，先手方必败。其余情况下，只要不是4的倍数，先手方拿一些石头使得剩余石头个数为4的倍数就能保证必胜。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>canWinNim</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span><span> n </span><span>%</span><span> </span></span><span>4</span><span><span> </span><span>!=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>293. Flip Game<a href="#293-flip-game"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/flip-game/" target="_blank">https://leetcode.com/problems/flip-game/</a></p><hr /><p>将字符串转为chararray，循环遍历遇到连续两个<code>+</code>时，翻转到<code>-</code>，再构造字符串添加到结果中；之后这里两个字母翻转为<code>+</code>，继续循环。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>generatePossibleNextMoves</span><span>(</span><span>String</span><span><span> </span><span>currentState</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>arr</span><span> </span></span><span><span>=</span><span> </span></span><span>currentState</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>currentState</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span><span> (arr[i] </span><span>==</span><span> </span></span><span>'+'</span><span><span> </span><span>&amp;&amp;</span><span> arr[i</span><span>+</span></span><span>1</span><span><span>] </span><span>==</span><span> </span></span><span>'+'</span><span>) {</span></div></div><div><div><div>8</div></div><div><span>                </span><span>// flip</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>arr[i] </span><span>=</span><span> </span><span>'-'</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>arr[i</span><span>+</span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>'-'</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>                </span><span>// add result</span></div></div><div><div><div>13</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>String</span><span>(arr));</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>                </span><span>// restore</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>arr[i] </span><span>=</span><span> </span><span>'+'</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>arr[i</span><span>+</span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>'+'</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>294. Flip Game II<a href="#294-flip-game-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/flip-game-ii/" target="_blank">https://leetcode.com/problems/flip-game-ii/</a></p><hr /><p>使用<code>-</code>分隔字符串，对每一个子字符串，分析其长度，如果其长度不为0且不是4的倍数+1，就说明对于这一组子字符串只要自己先手，就一定能让对方不能最终make move。因此添加这个长度到最终的set中。最终检查set中是否还存在元素，即可判断是否还有move。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>canWin</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>set</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>str</span><span> </span></span><span>:</span><span> </span><span>s</span><span>.</span><span>split</span><span>(</span><span>"-"</span><span>)) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>int</span><span><span> </span><span>curr</span><span> </span></span><span><span>=</span><span> </span></span><span>str</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (curr </span><span>!=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> curr </span><span>%</span><span> </span></span><span>4</span><span><span> </span><span>!=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>                </span><span>if</span><span><span> (curr </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>10</div></div><div><span><span>                    </span></span><span>curr--;</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>                </span><span>if</span><span> (</span><span>set</span><span>.</span><span>contains</span><span>(curr)) {</span></div></div><div><div><div>14</div></div><div><span>                    </span><span>set</span><span>.</span><span>remove</span><span>(curr);</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>16</div></div><div><span>                    </span><span>set</span><span>.</span><span>add</span><span>(curr);</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> </span><span>set</span><span>.</span><span>size</span><span><span>() </span><span>!=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>295. Find Median from Data Stream<a href="#295-find-median-from-data-stream"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-median-from-data-stream/" target="_blank">https://leetcode.com/problems/find-median-from-data-stream/</a></p><hr /><p>使用两个优先队列，一个存放较小的一半数，另一个存放较大的一半数。每次添加新<code>num</code>时，计算已有数据的中位数，决定<code>num</code>应该放到哪一半中，再调整平衡两个优先队列的个数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>MedianFinder</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>PriorityQueue</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> smallHalf</span></span><span><span>;</span><span> </span></span><span>// descending order</span></div></div><div><div><div>4</div></div><div><span>    </span><span>PriorityQueue</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> largeHalf</span></span><span><span>;</span><span> </span></span><span>// ascending order</span></div></div><div><div><div>5</div></div><div><span>    </span><span>int</span><span> totalCount </span><span><span>=</span><span> </span></span><span>0</span><span><span>;</span><span> </span></span><span>// total element's count</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>/** initialize your data structure here. */</span></div></div><div><div><div>8</div></div><div><span>    </span><span>public</span><span> </span><span>MedianFinder</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>smallHalf </span><span>=</span><span> </span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;&gt;((x, y) </span><span>-&gt;</span><span><span> y </span><span>-</span><span> x);</span></span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>largeHalf  </span><span>=</span><span> </span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;&gt;();</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>addNum</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>// initial median to spearate smallHalf and largeHalf num</span></div></div><div><div><div>15</div></div><div><span>        </span><span>double</span><span><span> </span><span>median</span><span> </span></span><span><span>=</span><span> totalCount </span><span>&gt;</span><span> </span></span><span>0</span><span> </span><span>?</span><span> </span><span>findMedian</span><span>() </span><span>:</span><span> num;</span></div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span><span> (num </span><span>&lt;</span><span> median) {</span></span></div></div><div><div><div>17</div></div><div><span>            </span><span>smallHalf</span><span>.</span><span>add</span><span>(num);</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>largeHalf</span><span>.</span><span>add</span><span>(num);</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// balance smallHalf and largeHalf</span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span> (</span><span>smallHalf</span><span>.</span><span>size</span><span><span>() </span><span>&gt;</span><span> </span></span><span>largeHalf</span><span>.</span><span>size</span><span><span>() </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>largeHalf</span><span>.</span><span>add</span><span>(</span><span>smallHalf</span><span>.</span><span>poll</span><span>());</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span> (</span><span>smallHalf</span><span>.</span><span>size</span><span><span>() </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>&lt;</span><span> </span></span><span>largeHalf</span><span>.</span><span>size</span><span>()) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>smallHalf</span><span>.</span><span>add</span><span>(</span><span>largeHalf</span><span>.</span><span>poll</span><span>());</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>totalCount++;</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>    </span><span>// largest element in smallHalf &amp; smallest element in largeHalf</span></div></div><div><div><div>34</div></div><div><span>    </span><span>public</span><span> </span><span>double</span><span> </span><span>findMedian</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>35</div></div><div><span>        </span><span>if</span><span> (</span><span>smallHalf</span><span>.</span><span>size</span><span><span>() </span><span>&gt;</span><span> </span></span><span>largeHalf</span><span>.</span><span>size</span><span>()) {</span></div></div><div><div><div>36</div></div><div><span>            </span><span>return</span><span> </span><span>smallHalf</span><span>.</span><span>peek</span><span>();</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>        </span><span>if</span><span> (</span><span>largeHalf</span><span>.</span><span>size</span><span><span>() </span><span>&gt;</span><span> </span></span><span>smallHalf</span><span>.</span><span>size</span><span>()) {</span></div></div><div><div><div>39</div></div><div><span>            </span><span>return</span><span> </span><span>largeHalf</span><span>.</span><span>peek</span><span>();</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>return</span><span> (</span><span>smallHalf</span><span>.</span><span>peek</span><span><span>() </span><span>+</span><span> </span></span><span>largeHalf</span><span>.</span><span>peek</span><span><span>()) </span><span>/</span><span> </span></span><span>2.0</span><span>;</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>296. Best Meeting Point<a href="#296-best-meeting-point"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/best-meeting-point/" target="_blank">https://leetcode.com/problems/best-meeting-point/</a></p><hr /><p>将每一行、每一列进行累加，得到两个1D的累加数组，分别记录每行与每列的和。之后对于每行或每列，用求和平衡法寻找到所有的行重心和列重心。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minTotalDistance</span><span>(</span><span>int</span><span><span>[][] </span><span>grid</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>grid</span><span>.</span><span>length</span><span><span>, n </span><span>=</span><span> grid[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>rowSum</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[n], colSum </span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[m];</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> m; i++)</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> n; j++) {</span></span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>rowSum[j] </span><span>+=</span><span> grid[i][j];</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>colSum[i] </span><span>+=</span><span> grid[i][j];</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span> </span><span>minDistance1D</span><span><span>(rowSum) </span><span>+</span><span> </span></span><span>minDistance1D</span><span>(colSum);</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minDistance1D</span><span>(</span><span>int</span><span><span>[] </span><span>vector</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span><span>-</span></span><span>1</span><span><span>, j </span><span>=</span><span> </span></span><span>vector</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>17</div></div><div><span>        </span><span>int</span><span><span> </span><span>distance</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, left </span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>// reach the middle sum point of each row and column</span></div></div><div><div><div>20</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>!=</span><span> j) {</span></span></div></div><div><div><div>21</div></div><div><span>            </span><span>if</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>distance </span><span>+=</span><span> left;</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>left </span><span>+=</span><span> vector[i];</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>distance </span><span>+=</span><span> right;</span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>j--;</span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>right </span><span>+=</span><span> vector[j];</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>return</span><span> distance;</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>297. Serialize and Deserialize Binary Tree<a href="#297-serialize-and-deserialize-binary-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/serialize-and-deserialize-binary-tree/" target="_blank">https://leetcode.com/problems/serialize-and-deserialize-binary-tree/</a></p><hr /><p>串行化的过程比较容易，直接使用前序遍历的方法，使用一个StringBuilder不断添加节点的值即可，中间用逗号分隔。</p><p>解串行化复原的过程稍难，由于不允许使用静态变量，因此需要使用一个长度为1的动态数组用于储存当前的下标，仍然使用前序遍历。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode(int x) { val = x; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>10</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Codec</span><span> </span></span><span>{</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span>// Encodes a tree to a single string.</span></div></div><div><div><div>13</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>serialize</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>15</div></div><div><span>        </span><span>serializeHelper</span><span>(root, sb);</span></div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>serializeHelper</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>, </span></span><span>StringBuilder</span><span><span> </span><span>sb</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>"null,"</span><span>);</span></div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>        </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>node</span><span>.</span><span>val</span><span>).</span><span>append</span><span>(</span><span>","</span><span>);</span></div></div><div><div><div>25</div></div><div><span>        </span><span>serializeHelper</span><span>(</span><span>node</span><span>.</span><span>left</span><span>, sb);</span></div></div><div><div><div>26</div></div><div><span>        </span><span>serializeHelper</span><span>(</span><span>node</span><span>.</span><span>right</span><span>, sb);</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>    </span><span>// Decodes your encoded data to tree.</span></div></div><div><div><div>30</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>deserialize</span><span>(</span><span>String</span><span><span> </span><span>data</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>nodes</span><span> </span></span><span><span>=</span><span> </span></span><span>data</span><span>.</span><span>split</span><span>(</span><span>","</span><span>);</span></div></div><div><div><div>32</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>1</span><span>];</span></div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span> </span><span>deserializeHelper</span><span>(nodes, index);</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>    </span><span>private</span><span> </span><span>TreeNode</span><span> </span><span>deserializeHelper</span><span>(</span><span>String</span><span><span>[] </span><span>nodes</span><span>, </span></span><span>int</span><span><span>[] </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>37</div></div><div><span>        </span><span>if</span><span> (nodes[index[</span><span>0</span><span>]].</span><span>equals</span><span>(</span><span>"null"</span><span>)) {</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>index[</span><span>0</span><span>]++;</span></div></div><div><div><div>39</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeNode</span><span>(</span><span>Integer</span><span>.</span><span>valueOf</span><span>(nodes[index[</span><span>0</span><span>]]));</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>index[</span><span>0</span><span>]++;</span></div></div><div><div><div>43</div></div><div><span>        </span><span>cur</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>deserializeHelper</span><span>(nodes, index);</span></div></div><div><div><div>44</div></div><div><span>        </span><span>cur</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>deserializeHelper</span><span>(nodes, index);</span></div></div><div><div><div>45</div></div><div><span>        </span><span>return</span><span> cur;</span></div></div><div><div><div>46</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>298. Binary Tree Longest Consecutive Sequence<a href="#298-binary-tree-longest-consecutive-sequence"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-longest-consecutive-sequence/" target="_blank">https://leetcode.com/problems/binary-tree-longest-consecutive-sequence/</a></p><hr /><p>使用dfs，如果当前节点孩子的值增长了1，就在连续计数上增加1，反之重置结果。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> result</span><span>;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>longestConsecutive</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>        </span><span>helper</span><span>(root, </span><span>0</span><span>, </span><span>root</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>helper</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>, </span></span><span>int</span><span><span> </span><span>tempCount</span><span>, </span></span><span>int</span><span><span> </span><span>value</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>28</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>// if node's value is as expected, add 1 to count</span></div></div><div><div><div>33</div></div><div><span>        </span><span>if</span><span> (</span><span>node</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> value) {</span></span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>tempCount++;</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>tempCount </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>// update result</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, tempCount);</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>// next level's node value should increment by 1</span></div></div><div><div><div>43</div></div><div><span>        </span><span>helper</span><span>(</span><span>node</span><span>.</span><span>left</span><span>, tempCount, </span><span>node</span><span>.</span><span>val</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>44</div></div><div><span>        </span><span>helper</span><span>(</span><span>node</span><span>.</span><span>right</span><span>, tempCount, </span><span>node</span><span>.</span><span>val</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>299. Bulls and Cows<a href="#299-bulls-and-cows"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/bulls-and-cows/" target="_blank">https://leetcode.com/problems/bulls-and-cows/</a></p><hr /><p>一次遍历解决问题：使用<code>numbers</code>数组记录每个数字出现的次数。最理想的情况下，两个数字的对应位置数字相等，直接累加<code>bull</code>。</p><p>遍历<code>secret</code>时，<code>numbers[i]</code>增加；此时如果遇到了<code>numbers[i]</code>小于0的情况，说明这个数字已经在<code>guess</code>中出现过，但是位置不对，因此累加<code>cow</code>。同理，遍历<code>guess</code>时，<code>numbers[i]</code>减少；此时如果遇到了<code>numbers[i]</code>大于0的情况，也说明这个数字已经在<code>secret</code>中出现过且位置不对，累加<code>cow</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>getHint</span><span>(</span><span>String</span><span><span> </span><span>secret</span><span>, </span></span><span>String</span><span><span> </span><span>guess</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>bulls</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, cows </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>numbers</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>10</span><span>];</span></div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>secret</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>if</span><span> (</span><span>secret</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>guess</span><span>.</span><span>charAt</span><span>(i)) {</span></div></div><div><div><div>7</div></div><div><span><span>                </span></span><span>bulls++;</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>9</div></div><div><span>                </span><span>if</span><span> (numbers[</span><span>secret</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'0'</span><span><span>] </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>10</div></div><div><span><span>                    </span></span><span>cows++;</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>numbers[</span><span>secret</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'0'</span><span>]++;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>                </span><span>if</span><span> (numbers[</span><span>guess</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'0'</span><span><span>] </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>15</div></div><div><span><span>                    </span></span><span>cows++;</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>numbers[</span><span>guess</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'0'</span><span>]--;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span><span> bulls </span><span>+</span><span> </span></span><span>"A"</span><span><span> </span><span>+</span><span> cows </span><span>+</span><span> </span></span><span>"B"</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>300. Longest Increasing Subsequence<a href="#300-longest-increasing-subsequence"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-increasing-subsequence/" target="_blank">https://leetcode.com/problems/longest-increasing-subsequence/</a></p><hr /><p>使用一个<code>tails</code>数组，<code>tails[i]</code>记录当递增序列长度为<code>i+1</code>时，最小的序列尾的值。由此，可以确定出大于这个最小序列尾的数的个数，记为<code>size</code>。</p><p>例如，对于数列<code>[4,5,6,3]</code>，有：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>len = 1   :      [4], [5], [6], [3]   =&gt; tails[0] = 3</span></div></div><div><div><div>2</div></div><div><span>len = 2   :      [4, 5], [5, 6]       =&gt; tails[1] = 5</span></div></div><div><div><div>3</div></div><div><span>len = 3   :      [4, 5, 6]            =&gt; tails[2] = 6</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>容易得知，<code>tails</code>是一个递增的数列。因此，每次加入一个数时就对<code>tails</code>使用一次二分查找，将这个数插入到<code>tails</code>中：</p><ul>
<li>如果当前数比所有的tail都大，则添加在<code>tails</code>的末尾</li>
<li>如果当前数位于某个(<code>tails[i-1]</code>, <code>tails[i]</code>]之间，更新<code>tails[i]</code>的值为当前数</li>
</ul><p>在这一过程中，如果添加的位置正好是<code>size</code>，说明这个数肯定也是也在LIS中，因此<code>size</code>增加1。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>lengthOfLIS</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>tails</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>nums</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>size</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// length of LIS</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> size;</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>13</div></div><div><span>                </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>14</div></div><div><span>                </span><span>if</span><span><span> (tails[mid] </span><span>&lt;</span><span> num) {</span></span></div></div><div><div><div>15</div></div><div><span><span>                    </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>17</div></div><div><span><span>                    </span></span><span>right </span><span>=</span><span> mid;</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>tails[left] </span><span>=</span><span> num;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>            </span><span>// update size</span></div></div><div><div><div>24</div></div><div><span>            </span><span>if</span><span><span> (left </span><span>==</span><span> size) {</span></span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>size++;</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> size;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2020-01-01-leetcode301-400/</id>
      <title type="text">LeetCode 301-400</title>
      <published>2020-01-01T00:00:00.000Z</published>
      <updated>2020-01-01T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2020-01-01-leetcode301-400/"/>
      <summary type="text">LeetCode Problems 301-400.</summary>
      <content type="html"><![CDATA[<p>LeetCode Problems 301-400.</p>

<section><h2>301. Remove Invalid Parentheses<a href="#301-remove-invalid-parentheses"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/remove-invalid-parentheses/" target="_blank">https://leetcode.com/problems/remove-invalid-parentheses/</a></p><hr /><p>从<code>iStart</code>起，统计<code>openPar</code>和<code>closePar</code>的个数，如果<code>closePar</code>更多，说明存在重复的闭括号需要删除。</p><p>确定了重复后，从<code>jStart</code>起，试图删除遇到的第一个重复<code>closePar</code>（或者字符串第一个字符就是<code>closePar</code>）。剩余的字符串继续递归检查。</p><p>如果从左到右检查后没有发现括号重复，再将原始字符串调转，对称检查另一半符号。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>removeInvalidParentheses</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>helper</span><span>(result, s, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>'('</span><span>, </span><span>')'</span><span>);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>helper</span><span>(</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span>, </span></span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>int</span><span><span> </span><span>iStart</span><span>, </span></span><span>int</span><span><span> </span><span>jStart</span><span>, </span></span><span>char</span><span><span> </span><span>openPar</span><span>, </span></span><span>char</span><span><span> </span><span>closePar</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>openNum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, closeNum </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> iStart; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> openPar) {</span></span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>openNum++;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> closePar) {</span></span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>closeNum++;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>// more closePar, so they need to be deleted</span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span><span> (closeNum </span><span>&gt;</span><span> openNum) {</span></span></div></div><div><div><div>21</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> jStart; j </span><span>&lt;=</span><span> i; j++) {</span></span></div></div><div><div><div>22</div></div><div><span>                    </span><span>// encounter first ) and delete, then use substring to recursively check two strings at each side</span></div></div><div><div><div>23</div></div><div><span>                    </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(j) </span><span>==</span><span> closePar </span><span>&amp;&amp;</span><span> (j </span><span>==</span><span> jStart </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span><span>(j</span><span>-</span></span><span>1</span><span><span>) </span><span>!=</span><span> closePar)) {</span></span></div></div><div><div><div>24</div></div><div><span>                        </span><span>helper</span><span>(result, </span><span>s</span><span>.</span><span>substring</span><span>(</span><span>0</span><span><span>, j) </span><span>+</span><span> </span></span><span>s</span><span>.</span><span>substring</span><span><span>(j</span><span>+</span></span><span>1</span><span>), i, j, openPar, closePar);</span></div></div><div><div><div>25</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>                </span><span>return</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>// reverse the string and recheck</span></div></div><div><div><div>33</div></div><div><span>        </span><span>String</span><span><span> </span><span>reversed</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>(s).</span><span>reverse</span><span>().</span><span>toString</span><span>();</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>// must check both '(' and ')'</span></div></div><div><div><div>36</div></div><div><span>        </span><span>if</span><span><span> (openPar </span><span>==</span><span> </span></span><span>'('</span><span>) {</span></div></div><div><div><div>37</div></div><div><span>            </span><span>helper</span><span>(result, reversed, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>')'</span><span>, </span><span>'('</span><span>);</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>39</div></div><div><span>            </span><span>// current sting is valid, add to result</span></div></div><div><div><div>40</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(reversed);</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>302. Smallest Rectangle Enclosing Black Pixels<a href="#302-smallest-rectangle-enclosing-black-pixels"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/smallest-rectangle-enclosing-black-pixels/" target="_blank">https://leetcode.com/problems/smallest-rectangle-enclosing-black-pixels/</a></p><hr /><p>基于给定的点坐标，向当前列的上、下，当前行的上、下进行四组二分查找，如果发现区间里仍然存在1，就继续向外搜索，直到没有0为止。用最后的四个坐标锁定出一个矩形，进而求出面积。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minArea</span><span>(</span><span>char</span><span><span>[][] </span><span>image</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (image </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>image</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> image[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>up</span><span> </span></span><span><span>=</span><span> </span></span><span>checkUp</span><span>(image, x);</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>down</span><span> </span></span><span><span>=</span><span> </span></span><span>checkDown</span><span>(image, x);</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>checkLeft</span><span>(image, y);</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>checkRight</span><span>(image, y);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span><span> (down </span><span>-</span><span> up </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>*</span><span> (right </span><span>-</span><span> left </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>checkUp</span><span>(</span><span>char</span><span><span>[][] </span><span>image</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span> </span><span>lo</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, hi </span><span>=</span><span> x;</span></span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>while</span><span><span> (lo </span><span>&lt;=</span><span> hi) {</span></span></div></div><div><div><div>19</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> lo </span><span>+</span><span> (hi </span><span>-</span><span> lo) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span> (</span><span>rowContainsOne</span><span>(image, mid)) {</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>hi </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>lo </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> lo;</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>checkDown</span><span>(</span><span>char</span><span><span>[][] </span><span>image</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>lo</span><span> </span></span><span><span>=</span><span> x, hi </span><span>=</span><span> </span></span><span>image</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>while</span><span><span> (lo </span><span>&lt;=</span><span> hi) {</span></span></div></div><div><div><div>34</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> lo </span><span>+</span><span> (hi </span><span>-</span><span> lo) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>35</div></div><div><span>            </span><span>if</span><span> (</span><span>rowContainsOne</span><span>(image, mid)) {</span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>lo </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>hi </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>return</span><span> hi;</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>checkLeft</span><span>(</span><span>char</span><span><span>[][] </span><span>image</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>46</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> y;</span></span></div></div><div><div><div>47</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>48</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>49</div></div><div><span>            </span><span>if</span><span> (</span><span>colContainsOne</span><span>(image, mid)) {</span></div></div><div><div><div>50</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>51</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>52</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>53</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>        </span><span>return</span><span> left;</span></div></div><div><div><div>57</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>checkRight</span><span>(</span><span>char</span><span><span>[][] </span><span>image</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>60</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> y, right </span><span>=</span><span> image[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>61</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>62</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>63</div></div><div><span>            </span><span>if</span><span> (</span><span>colContainsOne</span><span>(image, mid)) {</span></div></div><div><div><div>64</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>65</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>66</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>67</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>68</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>69</div></div><div>
</div></div><div><div><div>70</div></div><div><span>        </span><span>return</span><span> right;</span></div></div><div><div><div>71</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>72</div></div><div>
</div></div><div><div><div>73</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>rowContainsOne</span><span>(</span><span>char</span><span><span>[][] </span><span>image</span><span>, </span></span><span>int</span><span><span> </span><span>r</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>74</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> image[</span></span><span>0</span><span>].</span><span>length</span><span>; j++) {</span></div></div><div><div><div>75</div></div><div><span>            </span><span>if</span><span><span> (image[r][j] </span><span>==</span><span> </span></span><span>'1'</span><span>) {</span></div></div><div><div><div>76</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>77</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>78</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>79</div></div><div>
</div></div><div><div><div>80</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>81</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>82</div></div><div>
</div></div><div><div><div>83</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>colContainsOne</span><span>(</span><span>char</span><span><span>[][] </span><span>image</span><span>, </span></span><span>int</span><span><span> </span><span>c</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>84</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>image</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>85</div></div><div><span>            </span><span>if</span><span><span> (image[i][c] </span><span>==</span><span> </span></span><span>'1'</span><span>) {</span></div></div><div><div><div>86</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>87</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>88</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>89</div></div><div>
</div></div><div><div><div>90</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>91</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>92</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>303. Range Sum Query - Immutable<a href="#303-range-sum-query---immutable"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/range-sum-query-immutable/" target="_blank">https://leetcode.com/problems/range-sum-query-immutable/</a></p><hr /><p>使用一个<code>sums</code>数组，<code>sums[i]</code>表示截止到下表i时，<code>nums[0]</code>～<code>nums[i]</code>的和。调用分段求和时，需要根据<code>i</code>的的大小进行讨论。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>NumArray</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] sums</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>public</span><span> </span><span>NumArray</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>sums </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span>[</span><span>nums</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>sums[</span><span>0</span><span><span>] </span><span>=</span><span> nums[</span></span><span>0</span><span>];</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>sums[i] </span><span>=</span><span> sums[i </span><span>-</span><span> </span><span>1</span><span><span>] </span><span>+</span><span> nums[i];</span></span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>sumRange</span><span>(</span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span><span> i </span><span>==</span><span> </span></span><span>0</span><span> </span><span>?</span><span> sums[j] </span><span>:</span><span><span> sums[j] </span><span>-</span><span> sums[i </span><span>-</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>304. Range Sum Query 2D - Immutable<a href="#304-range-sum-query-2d---immutable"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/range-sum-query-2d-immutable/" target="_blank">https://leetcode.com/problems/range-sum-query-2d-immutable/</a></p><hr /><p>使用二维动态规划，其中<code>dp[i+1][j+1]</code>表示从<code>matrix[0][0]</code>到<code>matrix[i][j]</code>的数组元素和。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>+-----+-+-------+     +--------+-----+     +-----+---------+     +-----+--------+</span></div></div><div><div><div>2</div></div><div><span>|     | |       |     |        |     |     |     |         |     |     |        |</span></div></div><div><div><div>3</div></div><div><span>|     | |       |     |        |     |     |     |         |     |     |        |</span></div></div><div><div><div>4</div></div><div><span>+-----+-+       |     +--------+     |     |     |         |     +-----+        |</span></div></div><div><div><div>5</div></div><div><span>|     | |       |  =  |              |  +  |     |         |  -  |              |</span></div></div><div><div><div>6</div></div><div><span>+-----+-+       |     |              |     +-----+         |     |              |</span></div></div><div><div><div>7</div></div><div><span>|               |     |              |     |               |     |              |</span></div></div><div><div><div>8</div></div><div><span>|               |     |              |     |               |     |              |</span></div></div><div><div><div>9</div></div><div><span>+---------------+     +--------------+     +---------------+     +--------------+</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span><span>   </span></span><span>dp[i][j]      =    dp[i-1][j]    +     dp[i][j-1]    -   dp[i-1][j-1]   +</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>                        </span></span><span>matrix[i-1][j-1]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>推广至任意的坐标起始点和终点：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>+---------------+   +--------------+   +---------------+   +--------------+   +--------------+</span></div></div><div><div><div>2</div></div><div><span>|               |   |         |    |   |   |           |   |         |    |   |   |          |</span></div></div><div><div><div>3</div></div><div><span>|   (r1,c1)     |   |         |    |   |   |           |   |         |    |   |   |          |</span></div></div><div><div><div>4</div></div><div><span>|   +------+    |   |         |    |   |   |           |   +---------+    |   +---+          |</span></div></div><div><div><div>5</div></div><div><span>|   |      |    | = |         |    | - |   |           | - |      (r1,c2) | + |   (r1,c1)    |</span></div></div><div><div><div>6</div></div><div><span>|   |      |    |   |         |    |   |   |           |   |              |   |              |</span></div></div><div><div><div>7</div></div><div><span>|   +------+    |   +---------+    |   +---+           |   |              |   |              |</span></div></div><div><div><div>8</div></div><div><span>|        (r2,c2)|   |       (r2,c2)|   |   (r2,c1)     |   |              |   |              |</span></div></div><div><div><div>9</div></div><div><span>+---------------+   +--------------+   +---------------+   +--------------+   +--------------+</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>NumMatrix</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[][] dp</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>public</span><span> </span><span>NumMatrix</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (matrix </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span>, col </span><span>=</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>dp </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span><span>[row</span><span>+</span></span><span>1</span><span><span>][col</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> row; i++) {</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;=</span><span> col; j++) {</span></span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>dp[i][j] </span><span>=</span><span> dp[i</span><span>-</span><span>1</span><span><span>][j] </span><span>+</span><span> dp[i][j</span><span>-</span></span><span>1</span><span><span>] </span><span>-</span><span> dp[i</span><span>-</span></span><span>1</span><span><span>][j</span><span>-</span></span><span>1</span><span><span>] </span><span>+</span><span> matrix[i</span><span>-</span></span><span>1</span><span><span>][j</span><span>-</span></span><span>1</span><span>];</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>sumRegion</span><span>(</span><span>int</span><span><span> </span><span>row1</span><span>, </span></span><span>int</span><span><span> </span><span>col1</span><span>, </span></span><span>int</span><span><span> </span><span>row2</span><span>, </span></span><span>int</span><span><span> </span><span>col2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span><span> dp[row2</span><span>+</span></span><span>1</span><span><span>][col2</span><span>+</span></span><span>1</span><span><span>] </span><span>-</span><span> dp[row2</span><span>+</span></span><span>1</span><span><span>][col1] </span><span>-</span><span> dp[row1][col2</span><span>+</span></span><span>1</span><span><span>] </span><span>+</span><span> dp[row1][col1];</span></span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>305. Number of Islands II<a href="#305-number-of-islands-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/number-of-islands-ii/" target="_blank">https://leetcode.com/problems/number-of-islands-ii/</a></p><hr /><p>运用union-find思想，使用树来表达所有岛。通过<code>find()</code>可以找到所有岛的祖先；而<code>union()</code>则判断两个节点是否属于同一个岛。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>numIslands2</span><span>(</span><span>int</span><span><span> </span><span>m</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span>[][] </span><span>positions</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>parent</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[m</span><span>*</span><span>n </span><span>+</span><span> </span></span><span>1</span><span><span>], rank </span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[m</span><span>*</span><span>n </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>numIslands</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>positions</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>int</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> positions[i][</span></span><span>0</span><span>];</span></div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span><span> </span><span>y</span><span> </span></span><span><span>=</span><span> positions[i][</span></span><span>1</span><span>];</span></div></div><div><div><div>10</div></div><div><span>            </span><span>int</span><span><span> </span><span>offset</span><span> </span></span><span><span>=</span><span> x</span><span>*</span><span>n </span><span>+</span><span> y</span><span>+</span></span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>// duplicate position detected</span></div></div><div><div><div>13</div></div><div><span>            </span><span>// all positions have parent 0 initially, in case the parent is not 0 we must have encountered the position before)</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span><span> (parent[offset] </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(numIslands);</span></div></div><div><div><div>16</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>parent[offset] </span><span>=</span><span> offset;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>numIslands++;</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>if</span><span><span> (x </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> parent[offset</span><span>-</span><span>n] </span><span>!=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>union</span><span><span>(parent, rank, offset, offset</span><span>-</span><span>n)) {</span></span></div></div><div><div><div>23</div></div><div><span>                </span><span>// check the grid on top of current grid</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>numIslands--;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>            </span><span>if</span><span><span> (x </span><span>&lt;</span><span> m</span><span>-</span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> parent[offset</span><span>+</span><span>n] </span><span>!=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>union</span><span><span>(parent, rank, offset, offset</span><span>+</span><span>n)) {</span></span></div></div><div><div><div>27</div></div><div><span>                </span><span>// check the grid below current grid</span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>numIslands--;</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>            </span><span>if</span><span><span> (y </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> parent[offset</span><span>-</span></span><span>1</span><span><span>] </span><span>!=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>union</span><span><span>(parent, rank, offset, offset</span><span>-</span></span><span>1</span><span>)) {</span></div></div><div><div><div>31</div></div><div><span>                </span><span>// check the grid to the left of the current grid</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>numIslands--;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>            </span><span>if</span><span><span> (y </span><span>&lt;</span><span> n</span><span>-</span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> parent[offset</span><span>+</span></span><span>1</span><span><span>] </span><span>!=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>union</span><span><span>(parent, rank, offset, offset</span><span>+</span></span><span>1</span><span>)) {</span></div></div><div><div><div>35</div></div><div><span>                </span><span>// check the grid to the right of the current grid</span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>numIslands--;</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(numIslands);</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>    </span><span>// find root</span></div></div><div><div><div>45</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>find</span><span>(</span><span>int</span><span><span>[] </span><span>parent</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>46</div></div><div><span>        </span><span>if</span><span><span> (parent[x] </span><span>==</span><span> x) {</span></span></div></div><div><div><div>47</div></div><div><span>            </span><span>return</span><span> x;</span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span>        </span><span>return</span><span> </span><span>find</span><span>(parent, parent[x]);</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>union</span><span>(</span><span>int</span><span><span>[] </span><span>parent</span><span>, </span></span><span>int</span><span><span>[] </span><span>rank</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>53</div></div><div><span>        </span><span>int</span><span><span> </span><span>xparent</span><span> </span></span><span><span>=</span><span> </span></span><span>find</span><span>(parent, x);</span></div></div><div><div><div>54</div></div><div><span>        </span><span>int</span><span><span> </span><span>yparent</span><span> </span></span><span><span>=</span><span> </span></span><span>find</span><span>(parent, y);</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>        </span><span>// not belong to same island</span></div></div><div><div><div>57</div></div><div><span>        </span><span>if</span><span><span> (xparent </span><span>==</span><span> yparent) {</span></span></div></div><div><div><div>58</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>59</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>60</div></div><div>
</div></div><div><div><div>61</div></div><div><span>        </span><span>if</span><span><span> (rank[xparent] </span><span>==</span><span> rank[yparent]) {</span></span></div></div><div><div><div>62</div></div><div><span>            </span><span>// same rank, sacrifice x and increment y's rank</span></div></div><div><div><div>63</div></div><div><span><span>            </span></span><span>parent[xparent] </span><span>=</span><span> yparent;</span></div></div><div><div><div>64</div></div><div><span><span>            </span></span><span>rank[yparent]++;</span></div></div><div><div><div>65</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (rank[xparent] </span><span>&lt;</span><span> rank[yparent]) {</span></span></div></div><div><div><div>66</div></div><div><span>            </span><span>// higher rank is parent</span></div></div><div><div><div>67</div></div><div><span><span>            </span></span><span>parent[xparent] </span><span>=</span><span> yparent;</span></div></div><div><div><div>68</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>69</div></div><div><span><span>            </span></span><span>parent[yparent] </span><span>=</span><span> xparent;</span></div></div><div><div><div>70</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>71</div></div><div>
</div></div><div><div><div>72</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>73</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>74</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>306. Additive Number<a href="#306-additive-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/additive-number/" target="_blank">https://leetcode.com/problems/additive-number/</a></p><hr /><p>使用两个循环，分别表示用来试验的前两个数字，注意要排除掉两个数字以0开头的情况。之后的数字都可以从这两个数字推断得出，因此只要不断递推并和剩余字符串比较，如果第三个数符合的话，再向后寻找下一个符合的数，直到最后看是否完成了整个字符串的遍历。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isAdditiveNumber</span><span>(</span><span>String</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (num </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>num</span><span>.</span><span>length</span><span><span>() </span><span>&lt;</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>num</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>9</div></div><div><span>            </span><span>// get first number</span></div></div><div><div><div>10</div></div><div><span>            </span><span>String</span><span><span> </span><span>first</span><span> </span></span><span><span>=</span><span> </span></span><span>num</span><span>.</span><span>substring</span><span>(</span><span>0</span><span>, i);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>// first number cannot start with 0</span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span> (</span><span>first</span><span>.</span><span>startsWith</span><span>(</span><span>"0"</span><span><span>) </span><span>&amp;&amp;</span><span> </span></span><span>first</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>// get second number</span></div></div><div><div><div>18</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i </span><span>+</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;=</span><span> n; j++) {</span></span></div></div><div><div><div>19</div></div><div><span>                </span><span>String</span><span><span> </span><span>second</span><span> </span></span><span><span>=</span><span> </span></span><span>num</span><span>.</span><span>substring</span><span>(i, j);</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>                </span><span>// second number cannot start with 0</span></div></div><div><div><div>22</div></div><div><span>                </span><span>if</span><span> (</span><span>second</span><span>.</span><span>startsWith</span><span>(</span><span>"0"</span><span><span>) </span><span>&amp;&amp;</span><span> </span></span><span>second</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>                    </span><span>break</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>                </span><span>String</span><span><span> </span><span>remain</span><span> </span></span><span><span>=</span><span> </span></span><span>num</span><span>.</span><span>substring</span><span>(j);</span></div></div><div><div><div>28</div></div><div><span>                </span><span>if</span><span> (</span><span>remain</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>29</div></div><div><span>                    </span><span>break</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>                </span><span>// skip impossible case, where the third number is less than previous one</span></div></div><div><div><div>33</div></div><div><span>                </span><span>int</span><span><span> </span><span>maxLen</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(</span><span>first</span><span>.</span><span>length</span><span>(), </span><span>second</span><span>.</span><span>length</span><span>());</span></div></div><div><div><div>34</div></div><div><span>                </span><span>if</span><span><span> (maxLen </span><span>&gt;</span><span> </span></span><span>remain</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>35</div></div><div><span>                    </span><span>break</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>                </span><span>long</span><span><span> </span><span>firstNumber</span><span> </span></span><span><span>=</span><span> </span></span><span>Long</span><span>.</span><span>parseLong</span><span>(first);</span></div></div><div><div><div>39</div></div><div><span>                </span><span>long</span><span><span> </span><span>secondNumber</span><span> </span></span><span><span>=</span><span> </span></span><span>Long</span><span>.</span><span>parseLong</span><span>(second);</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>                </span><span>// deduct all following numbers and compare with string</span></div></div><div><div><div>42</div></div><div><span>                </span><span>while</span><span> (</span><span>remain</span><span>.</span><span>length</span><span><span>() </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>43</div></div><div><span>                    </span><span>long</span><span><span> </span><span>thirdNumber</span><span> </span></span><span><span>=</span><span> firstNumber </span><span>+</span><span> secondNumber;</span></span></div></div><div><div><div>44</div></div><div><span>                    </span><span>String</span><span><span> </span><span>third</span><span> </span></span><span><span>=</span><span> </span></span><span>String</span><span>.</span><span>valueOf</span><span>(thirdNumber);</span></div></div><div><div><div>45</div></div><div><span>                    </span><span>if</span><span> (</span><span>remain</span><span>.</span><span>startsWith</span><span>(third)) {</span></div></div><div><div><div>46</div></div><div><span><span>                        </span></span><span>firstNumber </span><span>=</span><span> secondNumber;</span></div></div><div><div><div>47</div></div><div><span><span>                        </span></span><span>secondNumber </span><span>=</span><span> thirdNumber;</span></div></div><div><div><div>48</div></div><div><span><span>                        </span></span><span>remain </span><span>=</span><span> </span><span>remain</span><span>.</span><span>substring</span><span>(</span><span>third</span><span>.</span><span>length</span><span>());</span></div></div><div><div><div>49</div></div><div><span><span>                    </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>50</div></div><div><span>                        </span><span>break</span><span>;</span></div></div><div><div><div>51</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>52</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span>                </span><span>// there should be no character left when finish</span></div></div><div><div><div>55</div></div><div><span>                </span><span>if</span><span> (</span><span>remain</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>56</div></div><div><span>                    </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>57</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>58</div></div><div><span>                    </span><span>continue</span><span>;</span></div></div><div><div><div>59</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>60</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>61</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>62</div></div><div>
</div></div><div><div><div>63</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>64</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>65</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>307. Range Sum Query - Mutable<a href="#307-range-sum-query---mutable"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/range-sum-query-mutable/" target="_blank">https://leetcode.com/problems/range-sum-query-mutable/</a></p><hr /><p>使用线段树。</p><p>Notation is node_index: corresponding segment (left border included, right excluded). At the bottom row we have our array (0-indexed), the leaves of the tree.</p><p>For now suppose it’s length is a power of 2 (16 in the example), so we get perfect binary tree. When going up the tree we take pairs of nodes with indices <code>(2 * i, 2 * i + 1)</code> and combine their values in their parent with index i. This way when we’re asked to find a sum on interval <code>[3, 11)</code>, we need to sum up only values in the nodes 19, 5, 12 and 26 (marked with bold), not all 8 values inside the interval.</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>NumArray</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] tree</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> n</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>NumArray</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>n </span><span>=</span><span> </span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>tree </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span>[</span><span>2</span><span><span> </span><span>*</span><span> n];</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> n; i </span><span>&lt;</span><span> n </span><span>&lt;&lt;</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>tree[i] </span><span>=</span><span> nums[i </span><span>-</span><span> n];</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> n </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>tree[i] </span><span>=</span><span> tree[i </span><span>&lt;&lt;</span><span> </span><span>1</span><span><span>] </span><span>+</span><span> tree[i </span><span>&lt;&lt;</span><span> </span></span><span>1</span><span><span> </span><span>|</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>void</span><span> </span><span>update</span><span>(</span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span><span> (tree[i </span><span>+=</span><span> n] </span><span>=</span><span> val; i </span><span>&gt;</span><span> </span></span><span>0</span><span><span>; i </span><span>&gt;&gt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>tree[i </span><span>&gt;&gt;</span><span> </span><span>1</span><span><span>] </span><span>=</span><span> tree[i] </span><span>+</span><span> tree[i </span><span>^</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>sumRange</span><span>(</span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>27</div></div><div><span>        </span><span>for</span><span><span> (i </span><span>+=</span><span> n, j </span><span>+=</span><span> n; i </span><span>&lt;=</span><span> j; i </span><span>&gt;&gt;=</span><span> </span></span><span>1</span><span><span>, j </span><span>&gt;&gt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>28</div></div><div><span>            </span><span>if</span><span><span> ((i </span><span>&amp;</span><span> </span></span><span>1</span><span><span>) </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> tree[i];</span></div></div><div><div><div>30</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>            </span><span>if</span><span><span> ((j </span><span>&amp;</span><span> </span></span><span>1</span><span><span>) </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> tree[j];</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>j--;</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>308. Range Sum Query 2D - Mutable<a href="#308-range-sum-query-2d---mutable"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/range-sum-query-2d-mutable/" target="_blank">https://leetcode.com/problems/range-sum-query-2d-mutable/</a></p><hr /><p>额外使用一个2D数组，存储当前行在此之前所有列的和。对于  函数，每当改变一个数组元素，同时也改变sum数组中改变位置之后所有列的值。对于<code>sumRegion()</code>函数，可以看作是2D版的Range Sum - Immutable，根据列坐标讨论进行相减即可求出目标范围内的和。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>NumMatrix</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[][] matrix</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[][] lSumMatrix</span><span><span>;</span><span> </span></span><span>// the sum of all previous columns</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>NumMatrix</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>this</span><span>.</span><span>matrix</span><span><span> </span><span>=</span><span> matrix;</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>if</span><span><span> (len </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>lSumMatrix </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span>[len][matrix[</span><span>0</span><span>].</span><span>length</span><span>];</span></div></div><div><div><div>11</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>lSumMatrix</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>lSumMatrix[i][</span><span>0</span><span><span>] </span><span>=</span><span> matrix[i][</span></span><span>0</span><span>];</span></div></div><div><div><div>13</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;</span><span> lSumMatrix[i].</span></span><span>length</span><span>; j++) {</span></div></div><div><div><div>14</div></div><div><span><span>                    </span></span><span>lSumMatrix[i][j] </span><span>=</span><span> lSumMatrix[i][j</span><span>-</span><span>1</span><span><span>] </span><span>+</span><span> matrix[i][j];</span></span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>update</span><span>(</span><span>int</span><span><span> </span><span>row</span><span>, </span></span><span>int</span><span><span> </span><span>col</span><span>, </span></span><span>int</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>21</div></div><div><span>        </span><span>int</span><span><span> </span><span>difference</span><span> </span></span><span><span>=</span><span> val </span><span>-</span><span> matrix[row][col];</span></span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>matrix[row][col] </span><span>=</span><span> val;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// update all following columns</span></div></div><div><div><div>25</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> col; j </span><span>&lt;</span><span> lSumMatrix[row].</span></span><span>length</span><span>; j++) {</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>lSumMatrix[row][j] </span><span>+=</span><span> difference;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>sumRegion</span><span>(</span><span>int</span><span><span> </span><span>row1</span><span>, </span></span><span>int</span><span><span> </span><span>col1</span><span>, </span></span><span>int</span><span><span> </span><span>row2</span><span>, </span></span><span>int</span><span><span> </span><span>col2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>// 2D version range sum - immutable</span></div></div><div><div><div>34</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> row1; i </span><span>&lt;=</span><span> row2; i++) {</span></span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>sum </span><span>+=</span><span> (lSumMatrix[i][col2] </span><span>-</span><span> (col1 </span><span>&gt;</span><span> </span><span>0</span><span> </span><span>?</span><span><span> lSumMatrix[i][col1</span><span>-</span></span><span>1</span><span>] </span><span>:</span><span> </span><span>0</span><span>));</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> sum;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>309. Best Time to Buy and Sell Stock with Cooldown<a href="#309-best-time-to-buy-and-sell-stock-with-cooldown"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/" target="_blank">https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/</a></p><hr /><p>使用<code>buy</code>和<code>sell</code>记录截止到今天为止，分别以买入/卖出操作结束所能获得到最大收益，再使用<code>prevBuy</code>和<code>prevSell</code>记录截止到前一天的收益。由于限制了卖出股票后必须休息一天，因此下一次买入的最大收益，只能从<code>prevSell + price</code>或者是<code>prevBuy</code>中获取到。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxProfit</span><span>(</span><span>int</span><span><span>[] </span><span>prices</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (prices </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>prices</span><span>.</span><span>length</span><span><span> </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// buy: max profit end with 'buy' action up to current day</span></div></div><div><div><div>8</div></div><div><span>        </span><span>// sell: max profit end with 'sell' action up to current day</span></div></div><div><div><div>9</div></div><div><span>        </span><span>// prevBuy, prevSell: max profit up to previous day</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>buy</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span><span>, prevBuy </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>sell</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, prevSell </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>price</span><span> </span></span><span>:</span><span> prices) {</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>prevBuy </span><span>=</span><span> buy;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>// use prevSell but not sell, since we cannot buy stock in 2 continuous days</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>buy </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(prevSell </span><span>-</span><span> price, prevBuy);</span></span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>prevSell </span><span>=</span><span> sell;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>sell </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(prevBuy </span><span>+</span><span> price, prevSell);</span></span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> sell;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>310. Minimum Height Trees<a href="#310-minimum-height-trees"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minimum-height-trees/" target="_blank">https://leetcode.com/problems/minimum-height-trees/</a></p><hr /><p>从所有叶子节点开始进行BFS，每一回循环中从删去所有叶子节点，再判断之前与其连接的每个节点是否成为了新的叶子。循环结束后剩下的节点都是符合条件的跟节点。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>findMinHeightTrees</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span>[][] </span><span>edges</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>leaves</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// 0 or 1 node tree</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> leaves;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>leaves</span><span>.</span><span>add</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>10</div></div><div><span>            </span><span>return</span><span> leaves;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;[] </span><span>lists</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>[n];</span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>lists[i] </span><span>=</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>e</span><span> </span></span><span>:</span><span> edges) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>int</span><span><span> </span><span>v1</span><span> </span></span><span><span>=</span><span> e[</span></span><span>0</span><span><span>], v2 </span><span>=</span><span> e[</span></span><span>1</span><span>];</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>lists[v1].</span><span>add</span><span>(v2);</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>lists[v2].</span><span>add</span><span>(v1);</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// all nodes with only 1 edge must be a valid root</span></div></div><div><div><div>25</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>26</div></div><div><span>            </span><span>if</span><span> (lists[i].</span><span>size</span><span><span>() </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>                </span><span>leaves</span><span>.</span><span>add</span><span>(i);</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> n;</span></span></div></div><div><div><div>32</div></div><div><span>        </span><span>while</span><span><span> (count </span><span>&gt;</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>count </span><span>-=</span><span> </span><span>leaves</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>34</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>newLeaves</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>            </span><span>for</span><span> (</span><span>Integer</span><span><span> </span><span>leaf</span><span> </span></span><span>:</span><span> leaves) {</span></div></div><div><div><div>37</div></div><div><span>                </span><span>for</span><span> (</span><span>Integer</span><span><span> </span><span>toRemove</span><span> </span></span><span>:</span><span> lists[leaf]) {</span></div></div><div><div><div>38</div></div><div><span><span>                    </span></span><span>lists[toRemove].</span><span>remove</span><span>(</span><span>Integer</span><span>.</span><span>valueOf</span><span>(leaf));</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>                    </span><span>// check whether become new leaf</span></div></div><div><div><div>41</div></div><div><span>                    </span><span>if</span><span> (lists[toRemove].</span><span>size</span><span><span>() </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>42</div></div><div><span>                        </span><span>newLeaves</span><span>.</span><span>add</span><span>(toRemove);</span></div></div><div><div><div>43</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span><span>            </span></span><span>leaves </span><span>=</span><span> newLeaves;</span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>        </span><span>return</span><span> leaves;</span></div></div><div><div><div>51</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>52</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>311. Sparse Matrix Multiplication<a href="#311-sparse-matrix-multiplication"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sparse-matrix-multiplication/" target="_blank">https://leetcode.com/problems/sparse-matrix-multiplication/</a></p><hr /><p>常规矩阵相乘；由于是稀疏矩阵，可以在循环遍历时用<code>A[i][j] != 0</code>快速跳过元素值为0的情况。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[][] </span><span>multiply</span><span>(</span><span>int</span><span><span>[][] </span><span>A</span><span>, </span></span><span>int</span><span><span>[][] </span><span>B</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>newRow</span><span> </span></span><span><span>=</span><span> </span></span><span>A</span><span>.</span><span>length</span><span><span>, ACol </span><span>=</span><span> </span></span><span>A</span><span>[</span><span>0</span><span>].</span><span>length</span><span><span>, newCol </span><span>=</span><span> </span></span><span>B</span><span>[</span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[newRow][newCol];</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> newRow; i++) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> ACol; j++) {</span></span></div></div><div><div><div>8</div></div><div><span>                </span><span>// sparse matrix</span></div></div><div><div><div>9</div></div><div><span>                </span><span>if</span><span> (</span><span>A</span><span><span>[i][j] </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>                    </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; k </span><span>&lt;</span><span> newCol; k++) {</span></span></div></div><div><div><div>11</div></div><div><span><span>                        </span></span><span>result[i][k] </span><span>+=</span><span> </span><span>A</span><span><span>[i][j] </span><span>*</span><span> </span></span><span>B</span><span>[j][k];</span></div></div><div><div><div>12</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>312. Burst Balloons<a href="#312-burst-balloons"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/burst-balloons/" target="_blank">https://leetcode.com/problems/burst-balloons/</a></p><hr /><p>先把输入的iNums数组进行拷贝，在头尾两端各添加一个1。再使用二维DP，考虑<code>dp[i][j]</code>作为<code>copy[i]</code>至<code>copy[i+l-1]</code>段的最大收益。收益主要有3种可能来源：</p><ol>
<li>打爆<code>copy[i]</code>至<code>copy[k-1]</code>段的气球，则最大收益来自<code>dp[i][k-1]</code></li>
<li>打爆<code>copy[k+1]</code>至<code>copy[j]</code>段的气球，则最大收益来自<code>dp[k+1][j]</code></li>
<li>只剩下<code>copy[k]</code>一个气球可以打，则最大收益为<code>copy[i-1] * copy[k] * copy[j+1]</code></li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxCoins</span><span>(</span><span>int</span><span><span>[] </span><span>iNums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (iNums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>iNums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>iNums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// a new array, with iNums[-1] and iNums[n]</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>copy</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[n</span><span>+</span></span><span>2</span><span>];</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>copy[</span><span>0</span><span><span>] </span><span>=</span><span> copy[n</span><span>+</span></span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>copy[i</span><span>+</span><span>1</span><span><span>] </span><span>=</span><span> iNums[i];</span></span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// dp[i][j] means the max coins collected from iNums[i] to iNums[j]</span></div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[n </span><span>+</span><span> </span></span><span>2</span><span><span>][n </span><span>+</span><span> </span></span><span>2</span><span>];</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>// define the subproblem size</span></div></div><div><div><div>19</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>l</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; l </span><span>&lt;=</span><span> n; l++) {</span></span></div></div><div><div><div>20</div></div><div><span>            </span><span>// We solve iNums[i] to iNums[i + l - 1]</span></div></div><div><div><div>21</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>+</span><span> l </span><span>-</span><span> </span></span><span>1</span><span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>22</div></div><div><span>                </span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i </span><span>+</span><span> l </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>                </span><span>int</span><span><span> </span><span>best</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>                </span><span>// three parts of coins</span></div></div><div><div><div>27</div></div><div><span>                </span><span>// 1. burst ballons from index i to k - 1, i.e. copy[i: k - 1], max coins for this part is dp[i][k - 1]</span></div></div><div><div><div>28</div></div><div><span>                </span><span>// 2. burst ballons from index k + 1 to j, i.e. copy[i: k - 1], max coins for this part is dp[k + 1][j]</span></div></div><div><div><div>29</div></div><div><span>                </span><span>// 3. only copy[k] is left, the coins we can get is copy[i - 1] * copy[k] * copy[j + 1]</span></div></div><div><div><div>30</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> i; k </span><span>&lt;=</span><span> j; k++) {</span></span></div></div><div><div><div>31</div></div><div><span><span>                    </span></span><span>best </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(best, dp[i][k </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>+</span><span> copy[i </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>*</span><span> copy[k] </span><span>*</span><span> copy[j </span><span>+</span><span> </span></span><span>1</span><span><span>] </span><span>+</span><span> dp[k </span><span>+</span><span> </span></span><span>1</span><span>][j]);</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>dp[i][j] </span><span>=</span><span> best;</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> dp[</span><span>1</span><span>][n];</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>313. Super Ugly Number<a href="#313-super-ugly-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/super-ugly-number/" target="_blank">https://leetcode.com/problems/super-ugly-number/</a></p><hr /><p>仍然是使用迭代，尝试所有可能的<code>idx * prime</code>得到所有的ugly numbers candidates，每一轮循环后再选出最小的candidate作为最终的ugly number。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>nthSuperUglyNumber</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span>[] </span><span>primes</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>ugly</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[n </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>ugly[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>pointer</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>primes</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span><span> </span><span>min</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>10</div></div><div><span>            </span><span>int</span><span><span> </span><span>minIndex</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>// try all primes as factor</span></div></div><div><div><div>13</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>primes</span><span>.</span><span>length</span><span>; j++) {</span></div></div><div><div><div>14</div></div><div><span>                </span><span>if</span><span><span> (ugly[pointer[j]] </span><span>*</span><span> primes[j] </span><span>&lt;</span><span> min) {</span></span></div></div><div><div><div>15</div></div><div><span><span>                    </span></span><span>min </span><span>=</span><span> ugly[pointer[j]] </span><span>*</span><span> primes[j];</span></div></div><div><div><div>16</div></div><div><span><span>                    </span></span><span>minIndex </span><span>=</span><span> j;</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (ugly[pointer[j]] </span><span>*</span><span> primes[j] </span><span>==</span><span> min) {</span></span></div></div><div><div><div>18</div></div><div><span><span>                    </span></span><span>pointer[j]++;</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>// choose the smallest one as next ugly number</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>ugly[i] </span><span>=</span><span> min;</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>pointer[minIndex]++;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span><span> ugly[n</span><span>-</span></span><span>1</span><span>];</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>314. Binary Tree Vertical Order Traversal<a href="#314-binary-tree-vertical-order-traversal"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-vertical-order-traversal/" target="_blank">https://leetcode.com/problems/binary-tree-vertical-order-traversal/</a></p><hr /><p>使用一个map，存储每一层的所有节点。为了实现这一目标，需要维护两个链表：</p><ul>
<li>一个遍历所有树节点的链表<code>queue</code></li>
<li>一个存储每个节点对应深度的链表<code>levels</code></li>
</ul><p>需要注意，这两个链表中的元素是一一对应的，即：从根节点开始，每遍历一个新节点时，同时向两个链表跟别添加这个节点的值和深度。使用BFS思想，如果遍历完一个节点，发现其还有左儿子或右儿子，就将其信息添加到这两个链表中，并且在每一轮循环中更新整个树的最小、最大深度。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>verticalOrder</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span>&gt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>20</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>// holding each level and values for that level</span></div></div><div><div><div>24</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;</span><span>Integer</span><span>, </span><span>List</span><span>&lt;</span><span>Integer</span><span>&gt;&gt;();</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>// each node in queue corresponds with each integer in levels</span></div></div><div><div><div>27</div></div><div><span>        </span><span>ArrayDeque</span><span>&lt;</span><span>TreeNode</span><span><span>&gt; </span><span>queue</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayDeque</span><span>&lt;</span><span>TreeNode</span><span>&gt;();</span></div></div><div><div><div>28</div></div><div><span>        </span><span>LinkedList</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>levels</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>29</div></div><div><span>        </span><span>queue</span><span>.</span><span>offer</span><span>(root);</span></div></div><div><div><div>30</div></div><div><span>        </span><span>levels</span><span>.</span><span>offer</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>// tracking min and max level for all nodes</span></div></div><div><div><div>33</div></div><div><span>        </span><span>int</span><span><span> </span><span>minLevel</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, maxLevel </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>queue</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>36</div></div><div><span>            </span><span>TreeNode</span><span><span> </span><span>node</span><span> </span></span><span><span>=</span><span> </span></span><span>queue</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>37</div></div><div><span>            </span><span>int</span><span><span> </span><span>l</span><span> </span></span><span><span>=</span><span> </span></span><span>levels</span><span>.</span><span>poll</span><span>(); </span><span>// level of current node</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>minLevel </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(minLevel, l);</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>maxLevel </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(maxLevel, l);</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>            </span><span>// for current level, add each node's value</span></div></div><div><div><div>43</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>map</span><span>.</span><span>containsKey</span><span>(l)) {</span></div></div><div><div><div>44</div></div><div><span>                </span><span>map</span><span>.</span><span>put</span><span>(l, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;());</span></div></div><div><div><div>45</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span>            </span><span>map</span><span>.</span><span>get</span><span>(l).</span><span>add</span><span>(</span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span>            </span><span>// add left and right children</span></div></div><div><div><div>49</div></div><div><span>            </span><span>if</span><span> (</span><span>node</span><span>.</span><span>left</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>50</div></div><div><span>                </span><span>queue</span><span>.</span><span>offer</span><span>(</span><span>node</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>51</div></div><div><span>                </span><span>levels</span><span>.</span><span>offer</span><span><span>(l </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>52</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span>            </span><span>if</span><span> (</span><span>node</span><span>.</span><span>right</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>54</div></div><div><span>                </span><span>queue</span><span>.</span><span>offer</span><span>(</span><span>node</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>55</div></div><div><span>                </span><span>levels</span><span>.</span><span>offer</span><span><span>(l </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>56</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>57</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span>        </span><span>// migrate each level's data to result</span></div></div><div><div><div>60</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> minLevel; i </span><span>&lt;=</span><span> maxLevel; i++) {</span></span></div></div><div><div><div>61</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>map</span><span>.</span><span>get</span><span>(i));</span></div></div><div><div><div>62</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>63</div></div><div>
</div></div><div><div><div>64</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>65</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>66</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>315. Count of Smaller Numbers After Self<a href="#315-count-of-smaller-numbers-after-self"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/count-of-smaller-numbers-after-self/" target="_blank">https://leetcode.com/problems/count-of-smaller-numbers-after-self/</a></p><hr /><p>使用归并排序，在merge拷贝到新数组的同时，用一个<code>count</code>数组统计当前数右边有几个数比自身小。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Item</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>int</span><span> val</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>int</span><span> index</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>public</span><span> </span><span>Item</span><span>(</span><span>int</span><span><span> </span><span>val</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>this</span><span>.</span><span>val</span><span><span> </span><span>=</span><span> val;</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>this</span><span>.</span><span>index</span><span><span> </span><span>=</span><span> index;</span></span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>countSmaller</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>// stores each num and its index</span></div></div><div><div><div>14</div></div><div><span>        </span><span>Item</span><span><span> </span><span>items</span><span>[] </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Item</span><span>[</span><span>nums</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>15</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>items[i] </span><span>=</span><span> </span><span>new</span><span> </span><span>Item</span><span>(nums[i], i);</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>// use mergesort to update count</span></div></div><div><div><div>20</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span>[] </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>nums</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>21</div></div><div><span>        </span><span>mergesort</span><span>(items, </span><span>0</span><span>, </span><span>items</span><span>.</span><span>length</span><span>-</span><span>1</span><span>, count);</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>// convert int[] to List</span></div></div><div><div><div>24</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>25</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>count</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(count[i]);</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>mergesort</span><span>(</span><span>Item</span><span><span> </span><span>items</span><span>[], </span></span><span>int</span><span><span> </span><span>low</span><span>, </span></span><span>int</span><span><span> </span><span>high</span><span>, </span></span><span>int</span><span><span> </span><span>count</span><span>[])</span><span> </span><span>{</span></span></div></div><div><div><div>33</div></div><div><span>        </span><span>if</span><span><span> (low </span><span>&gt;=</span><span> high) {</span></span></div></div><div><div><div>34</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> low </span><span>+</span><span> (high </span><span>-</span><span> low) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>38</div></div><div><span>        </span><span>mergesort</span><span>(items, low, mid, count);</span></div></div><div><div><div>39</div></div><div><span>        </span><span>mergesort</span><span><span>(items, mid</span><span>+</span></span><span>1</span><span>, high, count);</span></div></div><div><div><div>40</div></div><div><span>        </span><span>merge</span><span><span>(items, low, mid, mid</span><span>+</span></span><span>1</span><span>, high, count);</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>merge</span><span>(</span><span>Item</span><span><span>[] </span><span>items</span><span>, </span></span><span>int</span><span><span> </span><span>lowStart</span><span>, </span></span><span>int</span><span><span> </span><span>lowEnd</span><span>, </span></span><span>int</span><span><span> </span><span>highStart</span><span>, </span></span><span>int</span><span><span> </span><span>highEnd</span><span>, </span></span><span>int</span><span><span> </span><span>count</span><span>[])</span><span> </span><span>{</span></span></div></div><div><div><div>44</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> highEnd </span><span>-</span><span> lowStart </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>45</div></div><div><span>        </span><span>Item</span><span><span>[] </span><span>sortedArr</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Item</span><span>[len];</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>        </span><span>int</span><span><span> </span><span>lowPtr</span><span> </span></span><span><span>=</span><span> lowStart;</span></span></div></div><div><div><div>48</div></div><div><span>        </span><span>int</span><span><span> </span><span>highPtr</span><span> </span></span><span><span>=</span><span> highStart;</span></span></div></div><div><div><div>49</div></div><div><span>        </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>50</div></div><div><span>        </span><span>int</span><span><span> </span><span>rightCount</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>        </span><span>while</span><span><span> (lowPtr </span><span>&lt;=</span><span> lowEnd </span><span>&amp;&amp;</span><span> highPtr </span><span>&lt;=</span><span> highEnd) {</span></span></div></div><div><div><div>53</div></div><div><span>            </span><span>if</span><span> (items[highPtr].</span><span>val</span><span><span> </span><span>&lt;</span><span> items[lowPtr].</span></span><span>val</span><span>) {</span></div></div><div><div><div>54</div></div><div><span><span>                </span></span><span>rightCount++;</span></div></div><div><div><div>55</div></div><div><span><span>                </span></span><span>sortedArr[index] </span><span>=</span><span> items[highPtr];</span></div></div><div><div><div>56</div></div><div><span><span>                </span></span><span>index++;</span></div></div><div><div><div>57</div></div><div><span><span>                </span></span><span>highPtr++;</span></div></div><div><div><div>58</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>59</div></div><div><span><span>                </span></span><span>count[items[lowPtr].</span><span>index</span><span><span>] </span><span>+=</span><span> rightCount;</span></span></div></div><div><div><div>60</div></div><div><span><span>                </span></span><span>sortedArr[index] </span><span>=</span><span> items[lowPtr];</span></div></div><div><div><div>61</div></div><div><span><span>                </span></span><span>index++;</span></div></div><div><div><div>62</div></div><div><span><span>                </span></span><span>lowPtr++;</span></div></div><div><div><div>63</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>64</div></div><div>
</div></div><div><div><div>65</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>66</div></div><div>
</div></div><div><div><div>67</div></div><div><span>        </span><span>// only one of the loop will be executed</span></div></div><div><div><div>68</div></div><div><span>        </span><span>while</span><span><span> (lowPtr </span><span>&lt;=</span><span> lowEnd) {</span></span></div></div><div><div><div>69</div></div><div><span><span>            </span></span><span>count[items[lowPtr].</span><span>index</span><span><span>] </span><span>+=</span><span> rightCount;</span></span></div></div><div><div><div>70</div></div><div><span><span>            </span></span><span>sortedArr[index] </span><span>=</span><span> items[lowPtr];</span></div></div><div><div><div>71</div></div><div><span><span>            </span></span><span>index++;</span></div></div><div><div><div>72</div></div><div><span><span>            </span></span><span>lowPtr++;</span></div></div><div><div><div>73</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>74</div></div><div><span>        </span><span>while</span><span><span> (highPtr </span><span>&lt;=</span><span> highEnd) {</span></span></div></div><div><div><div>75</div></div><div><span><span>            </span></span><span>sortedArr[index] </span><span>=</span><span> items[highPtr];</span></div></div><div><div><div>76</div></div><div><span><span>            </span></span><span>index++;</span></div></div><div><div><div>77</div></div><div><span><span>            </span></span><span>highPtr++;</span></div></div><div><div><div>78</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>79</div></div><div>
</div></div><div><div><div>80</div></div><div><span>        </span><span>System</span><span>.</span><span>arraycopy</span><span>(sortedArr, </span><span>0</span><span>, items, lowStart, len);</span></div></div><div><div><div>81</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>82</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>316. Remove Duplicate Letters<a href="#316-remove-duplicate-letters"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/remove-duplicate-letters/" target="_blank">https://leetcode.com/problems/remove-duplicate-letters/</a></p><hr /><p>第一次遍历字符串，统计每个字符使用的次数；第二次遍历，正常情况下直接向StringBuilder复制当前遍历的字符，并使当前字符使用次数-1。但如果遇到了一个字典序更小的新字符，并且确定原来StringBuilder的最后一个字符还没用完，就将原来的最后一个字符删去，留待之后再重新加入。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>removeDuplicateLetters</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>5</div></div><div><span>        </span><span>boolean</span><span><span>[] </span><span>used</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>chr</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// count how many times each character is used</span></div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> chr) {</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>count[c </span><span>-</span><span> </span><span>'a'</span><span>]++;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> chr) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>// update count and see how many using times are left</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>count[c </span><span>-</span><span> </span><span>'a'</span><span>]--;</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>            </span><span>// this character is used in the result, skip</span></div></div><div><div><div>19</div></div><div><span>            </span><span>if</span><span><span> (used[c </span><span>-</span><span> </span></span><span>'a'</span><span>]) {</span></div></div><div><div><div>20</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>            </span><span>// a new smaller character &amp; there is still last character left, delete it</span></div></div><div><div><div>24</div></div><div><span>            </span><span>// wait for the deleted character to be added later</span></div></div><div><div><div>25</div></div><div><span>            </span><span>while</span><span> (</span><span>sb</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>sb</span><span>.</span><span>charAt</span><span>(</span><span>sb</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span><span>) </span><span>&gt;</span><span> c </span><span>&amp;&amp;</span><span> count[</span></span><span>sb</span><span>.</span><span>charAt</span><span>(</span><span>sb</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span><span>) </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>used[</span><span>sb</span><span>.</span><span>charAt</span><span>(</span><span>sb</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span><span>) </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>=</span><span> </span></span><span>false</span><span>;</span></div></div><div><div><div>27</div></div><div><span>                </span><span>sb</span><span>.</span><span>deleteCharAt</span><span>(</span><span>sb</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(c);</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>used[c </span><span>-</span><span> </span><span>'a'</span><span><span>] </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>317. Shortest Distance from All Buildings<a href="#317-shortest-distance-from-all-buildings"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/shortest-distance-from-all-buildings/" target="_blank">https://leetcode.com/problems/shortest-distance-from-all-buildings/</a></p><hr /><p>使用DFS，遍历数组，遇到第一块空地就开始BFS，同时不断递加距离和，再将空地的值减去总的距离和。完成之后，可能会发现有的楼不能到达；此外，也可能有的空地没有使用过，需要进行处理。之后，从所有距离和中选出一个最小的值，作为最终答案。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[][] dirs </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[][]{ {</span><span>0</span><span><span>,</span><span> </span></span><span>1</span><span><span>}</span><span>,</span><span> {</span></span><span>1</span><span><span>,</span><span> </span></span><span>0</span><span><span>}</span><span>,</span><span> {</span></span><span>0</span><span><span>,</span><span> </span><span>-</span></span><span>1</span><span><span>}</span><span>,</span><span> {</span><span>-</span></span><span>1</span><span><span>,</span><span> </span></span><span>0</span><span><span>} }</span><span>;</span></span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>shortestDistance</span><span>(</span><span>int</span><span><span>[][] </span><span>grid</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>if</span><span><span> (grid </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>grid</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>grid</span><span>.</span><span>length</span><span><span>, col </span><span>=</span><span> grid[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// a building which cannot be reached</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> row; i++) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> col; j++) {</span></span></div></div><div><div><div>13</div></div><div><span>                </span><span>if</span><span><span> (grid[i][j] </span><span>==</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> </span><span>!</span></span><span>helper</span><span>(grid, i, j, row, col)) {</span></div></div><div><div><div>14</div></div><div><span>                    </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>// select from all empty lands</span></div></div><div><div><div>20</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>21</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> row; i++) {</span></span></div></div><div><div><div>22</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> col; j++) {</span></span></div></div><div><div><div>23</div></div><div><span>                </span><span>if</span><span><span> (grid[i][j] </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>24</div></div><div><span><span>                    </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(result, </span><span>-</span><span>grid[i][j]);</span></span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span><span> result </span><span>==</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span> </span><span>?</span><span><span> </span><span>-</span></span><span>1</span><span> </span><span>:</span><span> result;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>helper</span><span>(</span><span>int</span><span><span>[][] </span><span>grid</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>, </span></span><span>int</span><span><span> </span><span>row</span><span>, </span></span><span>int</span><span><span> </span><span>col</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>33</div></div><div><span>        </span><span>boolean</span><span><span>[][] </span><span>visited</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span>[row][col];</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>visited[x][y] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>35</div></div><div><span>        </span><span>Queue</span><span>&lt;</span><span>int</span><span><span>[]&gt; </span><span>queue</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;</span><span>int</span><span>[]&gt;();</span></div></div><div><div><div>36</div></div><div><span>        </span><span>queue</span><span>.</span><span>offer</span><span>(</span><span>new</span><span> </span><span>int</span><span>[]{x, y, </span><span>1</span><span>});</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>queue</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>39</div></div><div><span>            </span><span>int</span><span><span> </span><span>size</span><span> </span></span><span><span>=</span><span> </span></span><span>queue</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>40</div></div><div><span>            </span><span>while</span><span><span> (size-- </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>41</div></div><div><span>                </span><span>int</span><span><span>[] </span><span>p</span><span> </span></span><span><span>=</span><span> </span></span><span>queue</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>dir</span><span> </span></span><span>:</span><span> dirs) {</span></div></div><div><div><div>44</div></div><div><span>                    </span><span>int</span><span><span> </span><span>nx</span><span> </span></span><span><span>=</span><span> p[</span></span><span>0</span><span><span>] </span><span>+</span><span> dir[</span></span><span>0</span><span>];</span></div></div><div><div><div>45</div></div><div><span>                    </span><span>int</span><span><span> </span><span>ny</span><span> </span></span><span><span>=</span><span> p[</span></span><span>1</span><span><span>] </span><span>+</span><span> dir[</span></span><span>1</span><span>];</span></div></div><div><div><div>46</div></div><div><span>                    </span><span>if</span><span><span> (nx </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> nx </span><span>&gt;=</span><span> row </span><span>||</span><span> ny </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> ny </span><span>&gt;=</span><span> col </span><span>||</span><span> visited[nx][ny]) {</span></span></div></div><div><div><div>47</div></div><div><span>                        </span><span>continue</span><span>;</span></div></div><div><div><div>48</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span><span>                    </span></span><span>visited[nx][ny] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>                    </span><span>// for all empty lands, use BFS to increment distance</span></div></div><div><div><div>53</div></div><div><span>                    </span><span>if</span><span><span> (grid[nx][ny] </span><span>&lt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>54</div></div><div><span><span>                        </span></span><span>grid[nx][ny] </span><span>-=</span><span> p[</span><span>2</span><span>];</span></div></div><div><div><div>55</div></div><div><span>                        </span><span>queue</span><span>.</span><span>offer</span><span>(</span><span>new</span><span> </span><span>int</span><span>[]{nx, ny, p[</span><span>2</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span>});</span></div></div><div><div><div>56</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>57</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>58</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>59</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>60</div></div><div>
</div></div><div><div><div>61</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> row; i++) {</span></span></div></div><div><div><div>62</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> col; j++) {</span></span></div></div><div><div><div>63</div></div><div><span>                </span><span>if</span><span><span> (</span><span>!</span><span>visited[i][j]) {</span></span></div></div><div><div><div>64</div></div><div><span>                    </span><span>// a building which cannot be reached</span></div></div><div><div><div>65</div></div><div><span>                    </span><span>if</span><span><span> (grid[i][j] </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>66</div></div><div><span>                        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>67</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>68</div></div><div>
</div></div><div><div><div>69</div></div><div><span>                    </span><span>// unused empty land</span></div></div><div><div><div>70</div></div><div><span>                    </span><span>if</span><span><span> (grid[i][j] </span><span>&lt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>71</div></div><div><span><span>                        </span></span><span>grid[i][j] </span><span>=</span><span> </span><span>3</span><span>;</span></div></div><div><div><div>72</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>73</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>74</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>75</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>76</div></div><div>
</div></div><div><div><div>77</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>78</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>79</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>318. Maximum Product of Word Lengths<a href="#318-maximum-product-of-word-lengths"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/maximum-product-of-word-lengths/" target="_blank">https://leetcode.com/problems/maximum-product-of-word-lengths/</a></p><hr /><p>将每一个输入的单词转变为比特组合，此处可以自定义转化规则，例如每一位和1的左移进行异或。完成后，就可以根据位运算判断两个单词是否重复，并更新最大值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxProduct</span><span>(</span><span>String</span><span><span>[] </span><span>words</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>arr</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>words</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// transform word into bits combination</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>words</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>String</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> words[i];</span></span></div></div><div><div><div>8</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>cur</span><span>.</span><span>length</span><span>(); j++) {</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>arr[i] </span><span>|=</span><span> </span><span>1</span><span><span> </span><span>&lt;&lt;</span><span> (</span></span><span>cur</span><span>.</span><span>charAt</span><span><span>(j) </span><span>-</span><span> </span></span><span>'a'</span><span>);</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span> </span><span>maxLen</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i</span><span>+</span></span><span>1</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span>; j++) {</span></div></div><div><div><div>16</div></div><div><span>                </span><span>// different words</span></div></div><div><div><div>17</div></div><div><span>                </span><span>if</span><span><span> ((arr[i] </span><span>&amp;</span><span> arr[j]) </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>18</div></div><div><span><span>                    </span></span><span>maxLen </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(maxLen, words[i].</span><span>length</span><span><span>() </span><span>*</span><span> words[j].</span></span><span>length</span><span>());</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> maxLen;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>319. Bulb Switcher<a href="#319-bulb-switcher"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/bulb-switcher/" target="_blank">https://leetcode.com/problems/bulb-switcher/</a></p><hr /><p>对于从1到<code>n</code>的所有数，所有完全平方数都有奇数个质因数（例如9 : 1, 3, 9)，其他数都是偶数个质因数。而每一轮的开灯与关灯，实际上取决于这一轮的间隔切中了哪一个质因数。因此，最终的开关灯情况取决于每个数质因数的奇偶性。在经过了<code>n</code>轮开关之后，显然，最后能保持开状态的灯序号正好是1~<code>n</code>之间的完全平方数。这样的完全平方数共有<code>sqrt(n)</code>个。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>bulbSwitch</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span> (</span><span>int</span><span>)</span><span>Math</span><span>.</span><span>sqrt</span><span>(n);</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>320. Generalized Abbreviation<a href="#320-generalized-abbreviation"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/generalized-abbreviation/" target="_blank">https://leetcode.com/problems/generalized-abbreviation/</a></p><hr /><p>回溯算法，逐位遍历生成一组缩略词，再向后递归调用新回溯。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>generateAbbreviations</span><span>(</span><span>String</span><span><span> </span><span>word</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>backtrack</span><span>(result, word, </span><span>new</span><span> </span><span>StringBuilder</span><span>(), </span><span>0</span><span>, </span><span>0</span><span>);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>// i for index, k for abbreviation</span></div></div><div><div><div>9</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span>, </span></span><span>String</span><span><span> </span><span>word</span><span>, </span></span><span>StringBuilder</span><span><span> </span><span>sb</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>sb</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>11</div></div><div><span>        </span><span>if</span><span><span> (i </span><span>==</span><span> </span></span><span>word</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (k </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>sb</span><span>.</span><span>append</span><span>(k);</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>sb</span><span>.</span><span>toString</span><span>());</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>backtrack</span><span><span>(result, word, sb, i</span><span>+</span></span><span>1</span><span><span>, k</span><span>+</span></span><span>1</span><span>);</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>// generate an abbr</span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span><span> (k </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>                </span><span>sb</span><span>.</span><span>append</span><span>(k);</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(i));</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>            </span><span>// start a new abbr from next character</span></div></div><div><div><div>26</div></div><div><span>            </span><span>backtrack</span><span><span>(result, word, sb, i</span><span>+</span></span><span>1</span><span>, </span><span>0</span><span>);</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>sb</span><span>.</span><span>setLength</span><span>(len);</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>321. Create Maximum Number<a href="#321-create-maximum-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/create-maximum-number/" target="_blank">https://leetcode.com/problems/create-maximum-number/</a></p><hr /><p>本质上是数组合并，并且需要我们根据双指针，人为实现一个数组的比较函数。使用一个循环遍历，将k一分为二，在两侧寻找“最大数组”，再将这两个“最大数组”合并起来，得到一个<code>candidate</code>数组。如果<code>candidate</code>大于已有的result，就更新result。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>maxNumber</span><span>(</span><span>int</span><span><span>[] </span><span>nums1</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums2</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>len1</span><span> </span></span><span><span>=</span><span> </span></span><span>nums1</span><span>.</span><span>length</span><span><span>, len2 </span><span>=</span><span> </span></span><span>nums2</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[k];</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(</span><span>0</span><span><span>, k </span><span>-</span><span> len2); i </span><span>&lt;=</span><span> k </span><span>&amp;&amp;</span><span> i </span><span>&lt;=</span><span> len1; i++) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>int</span><span><span>[] </span><span>candidate</span><span> </span></span><span><span>=</span><span> </span></span><span>merge</span><span>(</span><span>maxArray</span><span>(nums1, i), </span><span>maxArray</span><span><span>(nums2, k </span><span>-</span><span> i), k);</span></span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span> (</span><span>greater</span><span>(candidate, </span><span>0</span><span>, result, </span><span>0</span><span>)) {</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> candidate;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>// use mergesort to get a candidate array</span></div></div><div><div><div>16</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] </span><span>merge</span><span>(</span><span>int</span><span><span>[] </span><span>nums1</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums2</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>17</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[k];</span></div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, j </span><span>=</span><span> </span></span><span>0</span><span><span>, r </span><span>=</span><span> </span></span><span>0</span><span><span>; r </span><span>&lt;</span><span> k; r++) {</span></span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>result[r] </span><span>=</span><span> </span><span>greater</span><span>(nums1, i, nums2, j) </span><span>?</span><span> nums1[i++] </span><span>:</span><span> nums2[j++];</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span>// nums1 is 'greater than' nums2, if nums1 is longer or nums1[i] &gt; nums2[j]</span></div></div><div><div><div>25</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>greater</span><span>(</span><span>int</span><span><span>[] </span><span>nums1</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums2</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>nums1</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> j </span><span>&lt;</span><span> </span></span><span>nums2</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> nums1[i] </span><span>==</span><span> nums2[j]) {</span></span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>i++;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>j++;</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span><span> j </span><span>==</span><span> </span></span><span>nums2</span><span>.</span><span>length</span><span><span> </span><span>||</span><span> (i </span><span>&lt;</span><span> </span></span><span>nums1</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> nums1[i] </span><span>&gt;</span><span> nums2[j]);</span></span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>    </span><span>// get the max array within k length</span></div></div><div><div><div>34</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] </span><span>maxArray</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>35</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>36</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[k];</span></div></div><div><div><div>37</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, j </span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>38</div></div><div><span>            </span><span>while</span><span><span> (n </span><span>-</span><span> i </span><span>+</span><span> j </span><span>&gt;</span><span> k </span><span>&amp;&amp;</span><span> j </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> result[j </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>&lt;</span><span> nums[i]) {</span></span></div></div><div><div><div>39</div></div><div><span><span>                </span></span><span>j--;</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>            </span><span>if</span><span><span> (j </span><span>&lt;</span><span> k) {</span></span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>result[j] </span><span>=</span><span> nums[i];</span></div></div><div><div><div>43</div></div><div><span><span>                </span></span><span>j++;</span></div></div><div><div><div>44</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>322. Coin Change<a href="#322-coin-change"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/coin-change/" target="_blank">https://leetcode.com/problems/coin-change/</a></p><hr /><p>使用动态规划，<code>dp[i]</code>表示当总数为<code>i</code>时需要的硬币数量。遍历<code>coins</code>里的每个<code>coin</code>，假定这个面值就是我们当前拥有的最大面值，然后试着将<code>coin</code>到<code>amount</code>范围内所需的最少硬币数量更新。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>coinChange</span><span>(</span><span>int</span><span><span>[] </span><span>coins</span><span>, </span></span><span>int</span><span><span> </span><span>amount</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>dp</span><span>[] </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[amount </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span><span>(dp, amount </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>coin</span><span> </span></span><span>:</span><span> coins) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> coin; i </span><span>&lt;=</span><span> amount; i++) {</span></span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>dp[i] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(dp[i], dp[i </span><span>-</span><span> coin] </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span><span> dp[amount] </span><span>&lt;=</span><span> amount </span></span><span>?</span><span> dp[amount] </span><span>:</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>323. Number of Connected Components in an Undirected Graph<a href="#323-number-of-connected-components-in-an-undirected-graph"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/" target="_blank">https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/</a></p><hr /><p>使用一个数组<code>root</code>存储每个节点通往的根节点。遍历每一条边，如果发现两个边节点<code>root1</code>, <code>root2</code>通往的不是同一个根，就运用union思想将<code>root1</code>通往的根节点设为<code>root2</code>。这一过程相当于两个节点合成为了一个连通分量。由于初始的连通分量个数<code>n</code>实际上就是节点个数，因此需要让<code>n</code>递减1。查找根节点则运用find思想，逐步向上迭代，同时可以考虑进行路径压缩，加快后续查找效率。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>countComponents</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span>[][] </span><span>edges</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>roots</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>roots[i] </span><span>=</span><span> i;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>e</span><span> </span></span><span>:</span><span> edges) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span><span> </span><span>root1</span><span> </span></span><span><span>=</span><span> </span></span><span>find</span><span>(roots, e[</span><span>0</span><span>]);</span></div></div><div><div><div>10</div></div><div><span>            </span><span>int</span><span><span> </span><span>root2</span><span> </span></span><span><span>=</span><span> </span></span><span>find</span><span>(roots, e[</span><span>1</span><span>]);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>// two vertex of this edge is a connected component</span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span><span> (root1 </span><span>!=</span><span> root2) {</span></span></div></div><div><div><div>14</div></div><div><span>                </span><span>// union</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>roots[root1] </span><span>=</span><span> root2;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>                </span><span>// numbers of cc decrement by 1</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>n--;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> n;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>find</span><span>(</span><span>int</span><span><span>[] </span><span>roots</span><span>, </span></span><span>int</span><span><span> </span><span>id</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>while</span><span><span> (roots[id] </span><span>!=</span><span> id) {</span></span></div></div><div><div><div>27</div></div><div><span>            </span><span>// optional: path compression</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>roots[id] </span><span>=</span><span> roots[roots[id]];</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>id </span><span>=</span><span> roots[id];</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span> id;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>324. Wiggle Sort II<a href="#324-wiggle-sort-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/wiggle-sort-ii/" target="_blank">https://leetcode.com/problems/wiggle-sort-ii/</a></p><hr /><p>使用桶排序，大桶优先排布到奇数下标上，之后再排布到偶数下标。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>wiggleSort</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>bucket</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>5001</span><span>];</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>bucket[num]++;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>5000</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// fill odd index</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span>; i </span><span>+=</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>while</span><span><span> (bucket[index] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>index--;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>nums[i] </span><span>=</span><span> index;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>bucket[index]--;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>// fill even index</span></div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span>; i </span><span>+=</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>while</span><span><span> (bucket[index] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>index--;</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>nums[i] </span><span>=</span><span> index;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>bucket[index]--;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>325. Maximum Size Subarray Sum Equals k<a href="#325-maximum-size-subarray-sum-equals-k"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/maximum-size-subarray-sum-equals-k/" target="_blank">https://leetcode.com/problems/maximum-size-subarray-sum-equals-k/</a></p><hr /><p>使用一个map遍历数组，记录<code>nums</code>累加到当前下标的和，同时检查<code>nums[i] - k</code>是否在map中，因为如果<code>nums[i] - k</code>在map中，说明下标<code>map.get(nums[i] - k)</code>和<code>i</code>之间的<code>sum</code>恰好是<code>k</code>，此时判断这个长度是否需要更新为最大值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxSubArrayLen</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;(); </span><span>// &lt;sum, index&gt;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(</span><span>0</span><span><span>, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// every sum result</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>nums[i] </span><span>+=</span><span> nums[i </span><span>-</span><span> </span><span>1</span><span>];</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>// a new sum, add to map</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>map</span><span>.</span><span>containsKey</span><span>(nums[i])) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>map</span><span>.</span><span>put</span><span>(nums[i], i);</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>            </span><span>// find from previous sum key</span></div></div><div><div><div>19</div></div><div><span>            </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span><span>(nums[i] </span><span>-</span><span> k)) {</span></span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, i </span><span>-</span><span> </span></span><span>map</span><span>.</span><span>get</span><span><span>(nums[i] </span><span>-</span><span> k));</span></span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>326. Power of Three<a href="#326-power-of-three"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/power-of-three/" target="_blank">https://leetcode.com/problems/power-of-three/</a></p><hr /><p>3的次幂肯定不为0；而在int范围内，最大的3的次幂是3<sup>19</sup>，因此如果3<sup>19</sup>能被这个数整除，说明这个数就是3的次幂。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isPowerOfThree</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span><span> (n </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>1162261467</span><span><span> </span><span>%</span><span> n </span><span>==</span><span> </span></span><span>0</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>327. Count of Range Sum<a href="#327-count-of-range-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/count-of-range-sum/" target="_blank">https://leetcode.com/problems/count-of-range-sum/</a></p><hr /><p>先计算得到数组从头至当前的累加结果，再将累加数组一分为二，用mergesort分别计算两侧的结果后，合并数组。这样得到的复杂度是<code>O(nlogn)</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> count </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> lower</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> upper</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>countRangeSum</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>lower</span><span>, </span></span><span>int</span><span><span> </span><span>upper</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>this</span><span>.</span><span>lower</span><span><span> </span><span>=</span><span> lower;</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>this</span><span>.</span><span>upper</span><span><span> </span><span>=</span><span> upper;</span></span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>long</span><span><span>[] </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>long</span><span>[</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>11</div></div><div><span>        </span><span>long</span><span><span>[] </span><span>temp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>long</span><span>[</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>sum[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>sum[i] </span><span>=</span><span> sum[i </span><span>-</span><span> </span><span>1</span><span><span>] </span><span>+</span><span> (</span></span><span>long</span><span><span>) nums[i </span><span>-</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>mergesort</span><span>(sum, </span><span>0</span><span>, </span><span>sum</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>, temp);</span></div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> count;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>mergesort</span><span>(</span><span>long</span><span><span>[] </span><span>sum</span><span>, </span></span><span>int</span><span><span> </span><span>start</span><span>, </span></span><span>int</span><span><span> </span><span>end</span><span>, </span></span><span>long</span><span><span>[] </span><span>temp</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span><span> (start </span><span>&gt;=</span><span> end) {</span></span></div></div><div><div><div>24</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> start </span><span>+</span><span> (end </span><span>-</span><span> start) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>28</div></div><div><span>        </span><span>mergesort</span><span>(sum, start, mid, temp);</span></div></div><div><div><div>29</div></div><div><span>        </span><span>mergesort</span><span><span>(sum, mid </span><span>+</span><span> </span></span><span>1</span><span>, end, temp);</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>merge</span><span>(sum, start, mid, end, temp);</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>merge</span><span>(</span><span>long</span><span><span>[] </span><span>sum</span><span>, </span></span><span>int</span><span><span> </span><span>start</span><span>, </span></span><span>int</span><span><span> </span><span>mid</span><span>, </span></span><span>int</span><span><span> </span><span>end</span><span>, </span></span><span>long</span><span><span>[] </span><span>temp</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>35</div></div><div><span>        </span><span>int</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> mid </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>36</div></div><div><span>        </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> start;</span></span></div></div><div><div><div>37</div></div><div><span>        </span><span>int</span><span><span> </span><span>low</span><span> </span></span><span><span>=</span><span> mid </span><span>+</span><span> </span></span><span>1</span><span><span>, high </span><span>=</span><span> mid </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> start; left </span><span>&lt;=</span><span> mid; left++) {</span></span></div></div><div><div><div>40</div></div><div><span>            </span><span>// too small or too large</span></div></div><div><div><div>41</div></div><div><span>            </span><span>while</span><span><span> (low </span><span>&lt;=</span><span> end </span><span>&amp;&amp;</span><span> sum[low] </span><span>-</span><span> sum[left] </span><span>&lt;</span><span> lower) {</span></span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>low++;</span></div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>            </span><span>while</span><span><span> (high </span><span>&lt;=</span><span> end </span><span>&amp;&amp;</span><span> sum[high] </span><span>-</span><span> sum[left] </span><span>&lt;=</span><span> upper) {</span></span></div></div><div><div><div>45</div></div><div><span><span>                </span></span><span>high++;</span></div></div><div><div><div>46</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span>            </span><span>// complete merge sort</span></div></div><div><div><div>49</div></div><div><span>            </span><span>while</span><span><span> (right </span><span>&lt;=</span><span> end </span><span>&amp;&amp;</span><span> sum[right] </span><span>&lt;</span><span> sum[left]) {</span></span></div></div><div><div><div>50</div></div><div><span><span>                </span></span><span>temp[index] </span><span>=</span><span> sum[right];</span></div></div><div><div><div>51</div></div><div><span><span>                </span></span><span>index++;</span></div></div><div><div><div>52</div></div><div><span><span>                </span></span><span>right++;</span></div></div><div><div><div>53</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span><span>            </span></span><span>temp[index] </span><span>=</span><span> sum[left];</span></div></div><div><div><div>55</div></div><div><span><span>            </span></span><span>index++;</span></div></div><div><div><div>56</div></div><div><span><span>            </span></span><span>count </span><span>+=</span><span> high </span><span>-</span><span> low;</span></div></div><div><div><div>57</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>58</div></div><div><span>        </span><span>while</span><span><span> (right </span><span>&lt;=</span><span> end) {</span></span></div></div><div><div><div>59</div></div><div><span><span>            </span></span><span>temp[index] </span><span>=</span><span> sum[right];</span></div></div><div><div><div>60</div></div><div><span><span>                </span></span><span>index++;</span></div></div><div><div><div>61</div></div><div><span><span>                </span></span><span>right++;</span></div></div><div><div><div>62</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>63</div></div><div>
</div></div><div><div><div>64</div></div><div><span>        </span><span>// use cache to override sum</span></div></div><div><div><div>65</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> start; i </span><span>&lt;=</span><span> end; i++) {</span></span></div></div><div><div><div>66</div></div><div><span><span>            </span></span><span>sum[i] </span><span>=</span><span> temp[i];</span></div></div><div><div><div>67</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>68</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>69</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>328. Odd Even Linked List<a href="#328-odd-even-linked-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/odd-even-linked-list/" target="_blank">https://leetcode.com/problems/odd-even-linked-list/</a></p><hr /><p>使用两个指针，分别跟踪所有奇数节点和偶数节点，再额外使用一个变量存储第一个偶数节点（用于最后定位将所有偶数节点放置在奇数节点之后）。while循环中，提取下下个节点保证奇偶性作为下一个连接的元素。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>oddEvenList</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>ListNode</span><span><span> </span><span>odd</span><span> </span></span><span><span>=</span><span> head, even </span><span>=</span><span> </span></span><span>head</span><span>.</span><span>next</span><span><span>, evenHead </span><span>=</span><span> even;</span></span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>while</span><span><span> (even </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>even</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>17</div></div><div><span>                </span><span>// link all odd elements</span></div></div><div><div><div>18</div></div><div><span>                </span><span>odd</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>odd</span><span>.</span><span>next</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>odd </span><span>=</span><span> </span><span>odd</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>                </span><span>// link all even elements</span></div></div><div><div><div>22</div></div><div><span>                </span><span>even</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>even</span><span>.</span><span>next</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>even </span><span>=</span><span> </span><span>even</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>            </span><span>// even elements are placed behind odd elements</span></div></div><div><div><div>27</div></div><div><span>            </span><span>odd</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> evenHead;</span></span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span> head;</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>329. Longest Increasing Path in a Matrix<a href="#329-longest-increasing-path-in-a-matrix"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-increasing-path-in-a-matrix/" target="_blank">https://leetcode.com/problems/longest-increasing-path-in-a-matrix/</a></p><hr /><p>使用dfs，不断延伸尝试当前格四个方向能达到的最大值，并确保下一个值更大，再使用一个maxGrid数组记录下这个最大值。如果经过了已经访问过的方格，可以直接获取其最大值加快速度。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> result </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>// store each grid's possible maximum number</span></div></div><div><div><div>5</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[][] maxGrid</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>longestIncreasingPath</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>if</span><span><span> (matrix </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span>, n </span><span>=</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>maxGrid </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span>[m][n];</span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> m; i++) {</span></span></div></div><div><div><div>15</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> n; j++) {</span></span></div></div><div><div><div>16</div></div><div><span>                </span><span>helper</span><span>(matrix, i, j, </span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>);</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>helper</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>, </span></span><span>int</span><span><span> </span><span>last</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> i </span><span>&gt;=</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>||</span><span> j </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> j </span><span>&gt;=</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>// skip non-increasing case</span></div></div><div><div><div>29</div></div><div><span>        </span><span>if</span><span><span> (matrix[i][j] </span><span>&lt;=</span><span> last) {</span></span></div></div><div><div><div>30</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>// fetch result from previous calculation</span></div></div><div><div><div>34</div></div><div><span>        </span><span>if</span><span><span> (maxGrid[i][j] </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>35</div></div><div><span>            </span><span>return</span><span> maxGrid[i][j];</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>// four direcions</span></div></div><div><div><div>39</div></div><div><span>        </span><span>int</span><span><span> </span><span>v1</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span><span>(matrix, i</span><span>-</span></span><span>1</span><span>, j, matrix[i][j]);</span></div></div><div><div><div>40</div></div><div><span>        </span><span>int</span><span><span> </span><span>v2</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span><span>(matrix, i</span><span>+</span></span><span>1</span><span>, j, matrix[i][j]);</span></div></div><div><div><div>41</div></div><div><span>        </span><span>int</span><span><span> </span><span>v3</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span><span>(matrix, i, j</span><span>-</span></span><span>1</span><span>, matrix[i][j]);</span></div></div><div><div><div>42</div></div><div><span>        </span><span>int</span><span><span> </span><span>v4</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span><span>(matrix, i, j</span><span>+</span></span><span>1</span><span>, matrix[i][j]);</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>        </span><span>// choose the maximum result and update the maxGrid array</span></div></div><div><div><div>45</div></div><div><span>        </span><span>int</span><span><span> </span><span>max</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span> </span><span>+</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(v1, </span><span>Math</span><span>.</span><span>max</span><span>(v2, </span><span>Math</span><span>.</span><span>max</span><span>(v3, v4)));</span></div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, max);</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>maxGrid[i][j] </span><span>=</span><span> max;</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>        </span><span>return</span><span> max;</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>330. Patching Array<a href="#330-patching-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/patching-array/" target="_blank">https://leetcode.com/problems/patching-array/</a></p><hr /><p>先举一个例子：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[1,2,3,5,10,50,70], n = 100</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>看到第一个数1，我们知道[1,1]可以被覆盖</li>
<li>看到第二个数2，我们知道[1,3]可以被覆盖</li>
<li>3同理，[1,6]可以被覆盖</li>
<li>5同理，[1,11]可以被覆盖</li>
<li>10同理，[1,21]可以被覆盖</li>
<li>现在到50，发现不得不打补丁了，如果打补丁1，可以扩展为[1,22]，如果打补丁2，可以扩展为[1,23]…可见，要得到最大的范围，应该打的补丁是22，这样能得到[1,43]，为什么不能打补丁23呢？因为[1,2,3,5,10,23]得不到22</li>
<li>[1,43]还是没有覆盖50，按照类似的逻辑，这次应该打的补丁是44，将范围扩充到[1,87]</li>
<li>最后到70，在[1,87]内，范围被扩充到[1,157]</li>
<li>157 &gt; 100，结束</li>
</ul><p>所以，题目的要点在于，如果当前的范围是<code>[1, m]</code>，且当前的数字<code>num &gt; m</code>，我们应该打补丁<code>m+1</code>，使得范围扩充到<code>[1，2m+1]</code>。另外，注意当输入<code>n</code>很大时，需要考虑溢出的情况。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minPatches</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>long</span><span><span> </span><span>miss</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, i </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>while</span><span><span> (miss </span><span>&lt;=</span><span> n) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> nums[i] </span><span>&lt;=</span><span> miss) {</span></span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>miss </span><span>+=</span><span> nums[i];</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>miss </span><span>+=</span><span> miss;</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>result++;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>331. Verify Preorder Serialization of a Binary Tree<a href="#331-verify-preorder-serialization-of-a-binary-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/verify-preorder-serialization-of-a-binary-tree/" target="_blank">https://leetcode.com/problems/verify-preorder-serialization-of-a-binary-tree/</a></p><hr /><p>使用dfs，向前检查字符串，如果当前的下标超过了<code>s</code>的长度，或者遇到了<code>#</code>，就说明无路可走，停止于当前下标；否则，就访问当前节点（跳过所有非逗号的字符），再先后访问左、右子树。如果最终能完成整个字符串的遍历，就说明是合法的前序遍历序列。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isValidSerialization</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>dfs</span><span>(s, </span><span>0</span><span>);</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// whether finish whole string's examination</span></div></div><div><div><div>9</div></div><div><span>        </span><span>return</span><span><span> result </span><span>==</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>dfs</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>int</span><span><span> </span><span>idx</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>// cannot move forward, stop at current index</span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (idx </span><span>&gt;=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span><span>(idx) </span><span>==</span><span> </span></span><span>'#'</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>return</span><span> idx;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>// visit current node</span></div></div><div><div><div>19</div></div><div><span>        </span><span>while</span><span><span> (idx </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span><span>(idx) </span><span>!=</span><span> </span></span><span>','</span><span>) {</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>idx++;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>// +1 to skip ','</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>idx++;</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>// visit left tree</span></div></div><div><div><div>27</div></div><div><span>        </span><span>int</span><span><span> </span><span>l</span><span> </span></span><span><span>=</span><span> </span></span><span>dfs</span><span>(s, idx);</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// right tree, finish</span></div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span> </span><span>dfs</span><span><span>(s, l </span><span>+</span><span> </span></span><span>2</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>332. Reconstruct Itinerary<a href="#332-reconstruct-itinerary"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reconstruct-itinerary/" target="_blank">https://leetcode.com/problems/reconstruct-itinerary/</a></p><hr /><p>为每一个出发地维护一个优先队列，按照字典序记录所有从该出发地到达的目的地。从JFK出发，访问第一个到达的目的地，将其从优先队列中移出，再递归使用dfs访问从这个地方能到的目的地。重复这个过程，直到某个出发地已经没有能到达的目的地了，这个地方就是旅行日程的最终点，将其添加到结果中。之后迭代返回时，不断将地名添加在list的首位，以实现倒序添加的目的。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>String</span><span><span>,</span><span> </span></span><span>PriorityQueue</span><span>&lt;</span><span>String</span><span><span>&gt;&gt;</span><span> flights</span></span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>LinkedList</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> path</span></span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>findItinerary</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>tickets</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>flights </span><span>=</span><span> </span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>path </span><span>=</span><span> </span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// for each departure place, maintain a priority queue of arrival places</span></div></div><div><div><div>10</div></div><div><span>        </span><span>// by default, the string priority queue will be sorted in lexical order</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>ticket</span><span> </span></span><span>:</span><span> tickets) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>flights</span><span>.</span><span>putIfAbsent</span><span>(</span><span>ticket</span><span>.</span><span>get</span><span>(</span><span>0</span><span>), </span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;&gt;());</span></div></div><div><div><div>13</div></div><div><span>            </span><span>flights</span><span>.</span><span>get</span><span>(</span><span>ticket</span><span>.</span><span>get</span><span>(</span><span>0</span><span>)).</span><span>add</span><span>(</span><span>ticket</span><span>.</span><span>get</span><span>(</span><span>1</span><span>));</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// always start from JFK</span></div></div><div><div><div>17</div></div><div><span>        </span><span>dfs</span><span>(</span><span>"JFK"</span><span>);</span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> path;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>String</span><span><span> </span><span>departure</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>PriorityQueue</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>arrivals</span><span> </span></span><span><span>=</span><span> </span></span><span>flights</span><span>.</span><span>get</span><span>(departure);</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// dfs to explore first arrival place</span></div></div><div><div><div>25</div></div><div><span>        </span><span>while</span><span><span> (arrivals </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span><span>!</span></span><span>arrivals</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>dfs</span><span>(</span><span>arrivals</span><span>.</span><span>poll</span><span>());</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// reversely add to the result</span></div></div><div><div><div>30</div></div><div><span>        </span><span>path</span><span>.</span><span>addFirst</span><span>(departure);</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>333. Largest BST Subtree<a href="#333-largest-bst-subtree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/largest-bst-subtree/" target="_blank">https://leetcode.com/problems/largest-bst-subtree/</a></p><hr /><p>使用一个数组<code>result</code>传递当前记录的最大BST信息，其中<code>result[0]</code>和<code>result[1]</code>分别表示最小和最大值，而<code>result[2]</code>则记录了根节点。</p><p>从根节点开始访问，先找出当前节点左右子树中的最大BST，再判断加入当前节点是否会产生一个新的更大的BST，或者是返回这两棵BST中较大的那棵。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>largestBSTSubtree</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>largestBST</span><span>(root);</span></div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> result[</span><span>2</span><span>];</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] </span><span>largestBST</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[] {</span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>, </span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>, </span><span>0</span><span>};</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>largestBST</span><span>(</span><span>node</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>28</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>largestBST</span><span>(</span><span>node</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// adding current node contributes to a new largest BST</span></div></div><div><div><div>31</div></div><div><span>        </span><span>if</span><span> (</span><span>node</span><span>.</span><span>val</span><span><span> </span><span>&gt;</span><span> left[</span></span><span>1</span><span><span>] </span><span>&amp;&amp;</span><span> </span></span><span>node</span><span>.</span><span>val</span><span><span> </span><span>&lt;</span><span> right[</span></span><span>0</span><span>]) {</span></div></div><div><div><div>32</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[] { </span><span>Math</span><span>.</span><span>min</span><span>(</span><span>node</span><span>.</span><span>val</span><span>, left[</span><span>0</span><span>]), </span><span>Math</span><span>.</span><span>max</span><span>(</span><span>node</span><span>.</span><span>val</span><span>, right[</span><span>1</span><span>]), left[</span><span>2</span><span><span>] </span><span>+</span><span> right[</span></span><span>2</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span> };</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>// otherwise, the largest BST should be either left subtree or right subtree</span></div></div><div><div><div>36</div></div><div><span>        </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[] { </span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>, </span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>, </span><span>Math</span><span>.</span><span>max</span><span>(left[</span><span>2</span><span>], right[</span><span>2</span><span>]) };</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>334. Increasing Triplet Subsequence<a href="#334-increasing-triplet-subsequence"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/increasing-triplet-subsequence/" target="_blank">https://leetcode.com/problems/increasing-triplet-subsequence/</a></p><hr /><p>从前向后遍历，维护当前已经遍历的最小值和次小值。如果发现当前的数比这两个数都要大，就说明之前已经遍历的最小值、次小值与当前数满足递增关系。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>increasingTriplet</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>firstSmall</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>secondSmall</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span><span> (nums[i] </span><span>&lt;=</span><span> firstSmall) {</span></span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>firstSmall </span><span>=</span><span> nums[i];</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[i] </span><span>&lt;=</span><span> secondSmall) {</span></span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>secondSmall </span><span>=</span><span> nums[i];</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>12</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>335. Self Crossing<a href="#335-self-crossing"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/self-crossing/" target="_blank">https://leetcode.com/problems/self-crossing/</a></p><hr /><p>考虑到第四、五、六条线与第一条线相交的情况，分类讨论。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isSelfCrossing</span><span>(</span><span>int</span><span><span>[] </span><span>x</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (x </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>x</span><span>.</span><span>length</span><span><span> </span><span>&lt;</span><span> </span></span><span>4</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>3</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>x</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>// Fourth line crosses first line and onward</span></div></div><div><div><div>9</div></div><div><span>            </span><span>if</span><span><span> (x[i] </span><span>&gt;=</span><span> x[i</span><span>-</span></span><span>2</span><span><span>] </span><span>&amp;&amp;</span><span> x[i</span><span>-</span></span><span>1</span><span><span>] </span><span>&lt;=</span><span> x[i</span><span>-</span></span><span>3</span><span>]) {</span></div></div><div><div><div>10</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>// Fifth line meets first line and onward</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>&gt;=</span><span> </span></span><span>4</span><span><span> </span><span>&amp;&amp;</span><span> x[i</span><span>-</span></span><span>1</span><span><span>] </span><span>==</span><span> x[i</span><span>-</span></span><span>3</span><span><span>] </span><span>&amp;&amp;</span><span> x[i] </span><span>+</span><span> x[i</span><span>-</span></span><span>4</span><span><span>] </span><span>&gt;=</span><span> x[i</span><span>-</span></span><span>2</span><span>]) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>            </span><span>// Sixth line crosses first line and onward</span></div></div><div><div><div>19</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>&gt;=</span><span> </span></span><span>5</span><span><span> </span><span>&amp;&amp;</span><span> x[i</span><span>-</span></span><span>2</span><span><span>] </span><span>&gt;=</span><span>x[i</span><span>-</span></span><span>4</span><span><span>] </span><span>&amp;&amp;</span><span> x[i] </span><span>&gt;=</span><span> x[i</span><span>-</span></span><span>2</span><span><span>] </span><span>-</span><span> x[i</span><span>-</span></span><span>4</span><span><span>] </span><span>&amp;&amp;</span><span> x[i</span><span>-</span></span><span>1</span><span><span>] </span><span>&gt;=</span><span> x[i</span><span>-</span></span><span>3</span><span><span>] </span><span>-</span><span> x[i</span><span>-</span></span><span>5</span><span><span>] </span><span>&amp;&amp;</span><span> x[i</span><span>-</span></span><span>1</span><span><span>] </span><span>&lt;=</span><span> x[i</span><span>-</span></span><span>3</span><span>]) {</span></div></div><div><div><div>20</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>336. Palindrome Pairs<a href="#336-palindrome-pairs"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/palindrome-pairs/" target="_blank">https://leetcode.com/problems/palindrome-pairs/</a></p><hr /><p>使用Trie，添加每个单词时，倒序添加；搜索时，正序搜索。总的时间复杂度是<code>O(n * k^2)</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>static</span><span> </span><span>class</span><span><span> </span><span>TrieNode</span><span> </span></span><span>{</span></div></div><div><div><div>3</div></div><div><span>        </span><span>TrieNode</span><span>[] next</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span> index</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> list</span></span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>TrieNode</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>next </span><span>=</span><span> </span><span>new</span><span> </span><span>TrieNode</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>index </span><span>=</span><span> </span><span>-</span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>list </span><span>=</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>palindromePairs</span><span>(</span><span>String</span><span><span>[] </span><span>words</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>15</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>16</div></div><div><span>        </span><span>TrieNode</span><span><span> </span><span>root</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span>();</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>words</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>addWord</span><span>(root, words[i], i);</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>words</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>search</span><span>(words, i, root, result);</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>    </span><span>// add each word reversely</span></div></div><div><div><div>29</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>addWord</span><span>(</span><span>TrieNode</span><span><span> </span><span>root</span><span>, </span></span><span>String</span><span><span> </span><span>word</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>30</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>31</div></div><div><span>            </span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>word</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span>;</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>            </span><span>// add current word as a new node</span></div></div><div><div><div>34</div></div><div><span>            </span><span>if</span><span> (</span><span>root</span><span>.</span><span>next</span><span><span>[j] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>35</div></div><div><span>                </span><span>root</span><span>.</span><span>next</span><span><span>[j] </span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span>();</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>            </span><span>if</span><span> (</span><span>isPalindrome</span><span>(word, </span><span>0</span><span>, i)) {</span></div></div><div><div><div>39</div></div><div><span>                </span><span>root</span><span>.</span><span>list</span><span>.</span><span>add</span><span>(index);</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>root </span><span>=</span><span> </span><span>root</span><span>.</span><span>next</span><span>[j];</span></div></div><div><div><div>43</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span>        </span><span>root</span><span>.</span><span>list</span><span>.</span><span>add</span><span>(index);</span></div></div><div><div><div>46</div></div><div><span>        </span><span>root</span><span>.</span><span>index</span><span><span> </span><span>=</span><span> index;</span></span></div></div><div><div><div>47</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>search</span><span>(</span><span>String</span><span><span>[] </span><span>words</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>TrieNode</span><span><span> </span><span>root</span><span>, </span></span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>50</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> words[i].</span></span><span>length</span><span>(); j++) {</span></div></div><div><div><div>51</div></div><div><span>            </span><span>// valid &amp; non-equal index, all characters behind are palindrome</span></div></div><div><div><div>52</div></div><div><span>            </span><span>if</span><span> (</span><span>root</span><span>.</span><span>index</span><span><span> </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>root</span><span>.</span><span>index</span><span><span> </span><span>!=</span><span> i </span><span>&amp;&amp;</span><span> </span></span><span>isPalindrome</span><span>(words[i], j, words[i].</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>)) {</span></div></div><div><div><div>53</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(</span><span>Arrays</span><span>.</span><span>asList</span><span>(i, </span><span>root</span><span>.</span><span>index</span><span>));</span></div></div><div><div><div>54</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>            </span><span>// move to next word</span></div></div><div><div><div>57</div></div><div><span><span>            </span></span><span>root </span><span>=</span><span> </span><span>root</span><span>.</span><span>next</span><span>[words[i].</span><span>charAt</span><span><span>(j) </span><span>-</span><span> </span></span><span>'a'</span><span>];</span></div></div><div><div><div>58</div></div><div><span>            </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>59</div></div><div><span>                </span><span>return</span><span>;</span></div></div><div><div><div>60</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>61</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>62</div></div><div>
</div></div><div><div><div>63</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span>:</span><span> </span><span>root</span><span>.</span><span>list</span><span>) {</span></div></div><div><div><div>64</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>==</span><span> j) {</span></span></div></div><div><div><div>65</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>66</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>67</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>Arrays</span><span>.</span><span>asList</span><span>(i, j));</span></div></div><div><div><div>68</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>69</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>70</div></div><div>
</div></div><div><div><div>71</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isPalindrome</span><span>(</span><span>String</span><span><span> </span><span>word</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>72</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> j) {</span></span></div></div><div><div><div>73</div></div><div><span>            </span><span>if</span><span> (</span><span>word</span><span>.</span><span>charAt</span><span><span>(i++) </span><span>!=</span><span> </span></span><span>word</span><span>.</span><span>charAt</span><span>(j--)) {</span></div></div><div><div><div>74</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>75</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>76</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>77</div></div><div>
</div></div><div><div><div>78</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>79</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>80</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>337. House Robber III<a href="#337-house-robber-iii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/house-robber-iii/" target="_blank">https://leetcode.com/problems/house-robber-iii/</a></p><hr /><p>考虑两种情况：</p><ul>
<li>不偷当前根节点，那么最大利益的来源就是左、右子树的偷盗之和，并且左、右子树的偷盗必须都包含左右子树的根节点</li>
<li>偷当前根节点，那么最大利益的来源是当前节点与左、右子树的偷盗之和，并且左、右子树的偷盗都不能包含左右子树的根节点</li>
</ul><p>考虑到每个节点都有这两种情况，使用一个长度为2的数组记下两种利益，并比较大小，得到以每个点为根子树的最大收益。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>rob</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> </span><span>maxProfit</span><span>(root)[</span><span>1</span><span>];</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] </span><span>maxProfit</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[</span><span>2</span><span>];</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>2</span><span>];</span></div></div><div><div><div>27</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>maxProfit</span><span>(</span><span>root</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>28</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>maxProfit</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// maxProfit[0] = max Money skipping root, maxProfit[1] = max Money robbing root</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>result[</span><span>0</span><span><span>] </span><span>=</span><span> left[</span></span><span>1</span><span><span>] </span><span>+</span><span> right[</span></span><span>1</span><span>];</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>result[</span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(</span><span>root</span><span>.</span><span>val</span><span><span> </span><span>+</span><span> left[</span></span><span>0</span><span><span>] </span><span>+</span><span> right[</span></span><span>0</span><span>], result[</span><span>0</span><span>]);</span></div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>338. Counting Bits<a href="#338-counting-bits"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/counting-bits/" target="_blank">https://leetcode.com/problems/counting-bits/</a></p><hr /><p>按0，1，2-3，4-7，8-15，…的区间划分，可以发现每一个数拥有1的个数都是在此之前<code>offset</code>个数拥有1的个数加上1。例如：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>1(1) -&gt; 3(11), offset = 2</span></div></div><div><div><div>2</div></div><div><span>3(11) -&gt; 7(111), offset = 4</span></div></div><div><div><div>3</div></div><div><span>7(111) -&gt; 15(1111), offset = 8</span></div></div><div><div><div>4</div></div><div><span>...</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>而观察发现，<code>offset</code>都是2的次幂，并且一定是不大于当前遍历数<code>i</code>的最大2的次幂。因此，使用数组存储之前的结果，在得到<code>offset</code>之后，就能够直接根据<code>offset</code>提取之前的结果递增即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>countBits</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[num </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>offset</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>result</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span><span> (offset </span><span>*</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> i) {</span></span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>offset </span><span>*=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>result[i] </span><span>=</span><span> </span><span>1</span><span><span> </span><span>+</span><span> result[i </span><span>-</span><span> offset];</span></span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>339. Nested List Weight Sum<a href="#339-nested-list-weight-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/nested-list-weight-sum/" target="_blank">https://leetcode.com/problems/nested-list-weight-sum/</a></p><hr /><p>跟踪当前层数，注意到每一层的nestedList中可能有Integer或者List，分情况讨论，累加时乘上当前的层数即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* // This is the interface that allows for creating nested lists.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* // You should not implement it, or speculate about its implementation</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>* public interface NestedInteger {</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     // Constructor initializes an empty nested list.</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     public NestedInteger();</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     // Constructor initializes a single integer.</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     public NestedInteger(int value);</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*     // </span><span>@return</span><span> true if this NestedInteger holds a single integer, rather than a nested list.</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*     public boolean isInteger();</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>*     // </span><span>@return</span><span> the single integer that this NestedInteger holds, if it holds a single integer</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*     // Return null if this NestedInteger holds a nested list</span></div></div><div><div><div>16</div></div><div><span><span> </span></span><span>*     public Integer getInteger();</span></div></div><div><div><div>17</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>18</div></div><div><span><span> </span></span><span>*     // Set this NestedInteger to hold a single integer.</span></div></div><div><div><div>19</div></div><div><span><span> </span></span><span>*     public void setInteger(int value);</span></div></div><div><div><div>20</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>21</div></div><div><span><span> </span></span><span>*     // Set this NestedInteger to hold a nested list and adds a nested integer to it.</span></div></div><div><div><div>22</div></div><div><span><span> </span></span><span>*     public void add(NestedInteger ni);</span></div></div><div><div><div>23</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>24</div></div><div><span><span> </span></span><span>*     // </span><span>@return</span><span> the nested list that this NestedInteger holds, if it holds a nested list</span></div></div><div><div><div>25</div></div><div><span><span> </span></span><span>*     // Return empty list if this NestedInteger holds a single integer</span></div></div><div><div><div>26</div></div><div><span><span> </span></span><span>*     public List&lt;NestedInteger&gt; getList();</span></div></div><div><div><div>27</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>28</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>29</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>30</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>depthSum</span><span>(</span><span>List</span><span>&lt;</span><span>NestedInteger</span><span><span>&gt; </span><span>nestedList</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span> </span><span>helper</span><span>(nestedList, </span><span>1</span><span>);</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>helper</span><span>(</span><span>List</span><span>&lt;</span><span>NestedInteger</span><span><span>&gt; </span><span>nestedList</span><span>, </span></span><span>int</span><span><span> </span><span>level</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>35</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>// object in nestedList can either be an integer or a list</span></div></div><div><div><div>38</div></div><div><span>        </span><span>for</span><span> (</span><span>NestedInteger</span><span><span> </span><span>obj</span></span><span>:</span><span> nestedList) {</span></div></div><div><div><div>39</div></div><div><span>            </span><span>if</span><span> (</span><span>obj</span><span>.</span><span>isInteger</span><span>()) {</span></div></div><div><div><div>40</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> level </span><span>*</span><span> </span><span>obj</span><span>.</span><span>getInteger</span><span>();</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> </span><span>helper</span><span>(</span><span>obj</span><span>.</span><span>getList</span><span><span>(), level </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>47</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>340. Longest Substring with At Most K Distinct Characters<a href="#340-longest-substring-with-at-most-k-distinct-characters"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-substring-with-at-most-k-distinct-characters/" target="_blank">https://leetcode.com/problems/longest-substring-with-at-most-k-distinct-characters/</a></p><hr /><p>维护一个sliding window，时刻关注window中不同字母的数量，如果超过<code>k</code>了就需要从头不断删字符，直到不同的字母数量降到<code>k</code>或<code>k</code>以下。每遍历一个字符就更新一次结果。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>lengthOfLongestSubstringKDistinct</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>256</span><span>];</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>distinctNum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// current distinct characters count</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>start</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// start index of sliding window</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>end</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; end </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); end++) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>// append a new distinct character to the sliding window</span></div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span> (count[</span><span>s</span><span>.</span><span>charAt</span><span><span>(end)]++ </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>distinctNum++;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>            </span><span>// more than k distinct characters, repeatedly delete starting characters of sliding window</span></div></div><div><div><div>16</div></div><div><span>            </span><span>if</span><span><span> (distinctNum </span><span>&gt;</span><span> k) {</span></span></div></div><div><div><div>17</div></div><div><span>                </span><span>while</span><span> (--count[</span><span>s</span><span>.</span><span>charAt</span><span><span>(start++)] </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>18</div></div><div><span><span>                    </span></span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>distinctNum--;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, end </span><span>-</span><span> start </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>341. Flatten Nested List Iterator<a href="#341-flatten-nested-list-iterator"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/flatten-nested-list-iterator/" target="_blank">https://leetcode.com/problems/flatten-nested-list-iterator/</a></p><hr /><p>仍然是分情况讨论每一个nestedObj是integer还是list。如果当前的元素是list，就递归先将这个list里的所有元素全部添加到结果中，再返回处理后续的元素。遍历过程中，使用一个变量<code>counter</code>记录当前访问的下标，如果当前下标小于总的list长度，说明还没访问完。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* // This is the interface that allows for creating nested lists.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* // You should not implement it, or speculate about its implementation</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>* public interface NestedInteger {</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     // </span><span>@return</span><span> true if this NestedInteger holds a single integer, rather than a nested list.</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     public boolean isInteger();</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     // </span><span>@return</span><span> the single integer that this NestedInteger holds, if it holds a single integer</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*     // Return null if this NestedInteger holds a nested list</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*     public Integer getInteger();</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     // </span><span>@return</span><span> the nested list that this NestedInteger holds, if it holds a nested list</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>*     // Return empty list if this NestedInteger holds a single integer</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*     public List&lt;NestedInteger&gt; getList();</span></div></div><div><div><div>16</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>17</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>18</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>NestedIterator</span><span> </span></span><span>implements</span><span><span> </span><span>Iterator</span><span>&lt;</span><span>Integer</span><span>&gt;</span><span> </span></span><span>{</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span>private</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> allValues </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>21</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> counter </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>public</span><span> </span><span>NestedIterator</span><span>(</span><span>List</span><span>&lt;</span><span>NestedInteger</span><span><span>&gt; </span><span>nestedList</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>// Flatten the list and then put the iterator to it.</span></div></div><div><div><div>25</div></div><div><span>        </span><span>for</span><span> (</span><span>NestedInteger</span><span><span> </span><span>val</span></span><span>:</span><span> nestedList) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>recursiveIterate</span><span>(val, allValues);</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>@</span><span>Override</span></div></div><div><div><div>31</div></div><div><span>    </span><span>public</span><span> </span><span>Integer</span><span> </span><span>next</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>32</div></div><div><span>        </span><span>Integer</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>allValues</span><span>.</span><span>get</span><span>(counter);</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>counter++;</span></div></div><div><div><div>34</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>@</span><span>Override</span></div></div><div><div><div>39</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>hasNext</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>40</div></div><div><span>        </span><span>return</span><span><span> counter </span><span>&lt;</span><span> </span></span><span>allValues</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>recursiveIterate</span><span>(</span><span>NestedInteger</span><span><span> </span><span>nestedObj</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>allValues</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>44</div></div><div><span>        </span><span>// object in nestedList can either be an integer or a list</span></div></div><div><div><div>45</div></div><div><span>        </span><span>if</span><span> (</span><span>nestedObj</span><span>.</span><span>isInteger</span><span>()) {</span></div></div><div><div><div>46</div></div><div><span>            </span><span>allValues</span><span>.</span><span>add</span><span>(</span><span>nestedObj</span><span>.</span><span>getInteger</span><span>());</span></div></div><div><div><div>47</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>        </span><span>for</span><span> (</span><span>NestedInteger</span><span><span> </span><span>val</span></span><span>:</span><span> </span><span>nestedObj</span><span>.</span><span>getList</span><span>()) {</span></div></div><div><div><div>51</div></div><div><span>            </span><span>recursiveIterate</span><span>(val, allValues);</span></div></div><div><div><div>52</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span>}</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>/**</span></div></div><div><div><div>57</div></div><div><span><span> </span></span><span>* Your NestedIterator object will be instantiated and called as such:</span></div></div><div><div><div>58</div></div><div><span><span> </span></span><span>* NestedIterator i = new NestedIterator(nestedList);</span></div></div><div><div><div>59</div></div><div><span><span> </span></span><span>* while (i.hasNext()) v[f()] = i.next();</span></div></div><div><div><div>60</div></div><div><span><span> </span></span><span>*/</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>342. Power of Four<a href="#342-power-of-four"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/power-of-four/" target="_blank">https://leetcode.com/problems/power-of-four/</a></p><hr /><p>一个数是4的次幂，需要满足三个条件：</p><ul>
<li>大于0</li>
<li>二进制表示下，只有一个’1’。因此，可以使用<code>num &amp; (num - 1)</code>去除掉这个1，检查是否变成0</li>
<li>这个’1’一定是在奇数位上。因此，使用0x55555555检查<code>num</code>的1是否位置正确</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isPowerOfFour</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span><span> (num </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> (num </span><span>&amp;</span><span> (num </span><span>-</span><span> </span></span><span>1</span><span><span>)) </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> (num </span><span>&amp;</span><span> </span></span><span>0x55555555</span><span><span>) </span><span>!=</span><span> </span></span><span>0</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>343. Integer Break<a href="#343-integer-break"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/integer-break/" target="_blank">https://leetcode.com/problems/integer-break/</a></p><hr /><p>对于一个数<code>N</code>，如果<code>N</code>是偶数，拆分成<code>(N/2) * (N/2)</code>能得到最大的积；如果<code>N</code>是奇数，拆分成<code>((N-1)/2) * ((N+1)/2)</code>能得到最大的积。</p><p>要完成这样的拆分，不难可以发现每一项拆出来的数必须小于4，否则我们总能进一步拆分这个数得到更大的乘积。排除1，合理的项只有2或者3了。进一步观察发现，尽可能多的使用3，比起使用2会得到更大的乘积（例如 6 = 3 + 3 = 2 + 2 + 2，但是3 * 3 &gt; 2 * 2 * 2）。因此，使用循环，在可行范围内尽可能使用3。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>integerBreak</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>product</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span>        </span><span>while</span><span><span> (n </span><span>&gt;</span><span> </span></span><span>4</span><span>) {</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>product </span><span>*=</span><span> </span><span>3</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>n </span><span>-=</span><span> </span><span>3</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>product </span><span>*=</span><span> n;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span> product;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>344. Reverse String<a href="#344-reverse-string"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reverse-string/" target="_blank">https://leetcode.com/problems/reverse-string/</a></p><hr /><p>头尾指针交换字符。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>reverseString</span><span>(</span><span>char</span><span><span>[] </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>begin</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, end </span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>while</span><span><span> (begin </span><span>&lt;</span><span> end) {</span></span></div></div><div><div><div>9</div></div><div><span>            </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> s[begin];</span></span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>s[begin] </span><span>=</span><span> s[end];</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>s[end] </span><span>=</span><span> c;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>begin++;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>end--;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>345. Reverse Vowels of a String<a href="#345-reverse-vowels-of-a-string"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reverse-vowels-of-a-string/" target="_blank">https://leetcode.com/problems/reverse-vowels-of-a-string/</a></p><hr /><p>仍然是头尾双指针，只有双指针都是元音字母时才进行交换。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>reverseVowels</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>arr</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, j </span><span>=</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> j) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>boolean</span><span><span> </span><span>notVowel</span><span> </span></span><span><span>=</span><span> </span></span><span>false</span><span>;</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>isVowels</span><span>(arr[i])) {</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>notVowel </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>isVowels</span><span>(arr[j])) {</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>j--;</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>notVowel </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>            </span><span>if</span><span> (notVowel) {</span></div></div><div><div><div>17</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>            </span><span>char</span><span><span> </span><span>tmp</span><span> </span></span><span><span>=</span><span> arr[i];</span></span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>arr[i] </span><span>=</span><span> arr[j];</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>arr[j] </span><span>=</span><span> tmp;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>i++;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>j--;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> </span><span>new</span><span> </span><span>String</span><span>(arr);</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isVowels</span><span>(</span><span>char</span><span><span> </span><span>c</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span><span> c </span><span>==</span><span> </span></span><span>'a'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'e'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'i'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'o'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'u'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'A'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'E'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'I'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'O'</span><span><span> </span><span>||</span><span> c </span><span>==</span><span> </span></span><span>'U'</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>346. Moving Average from Data Stream<a href="#346-moving-average-from-data-stream"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/moving-average-from-data-stream/" target="_blank">https://leetcode.com/problems/moving-average-from-data-stream/</a></p><hr /><p>维护一个队列，如果队列中的元素数量超过window size，就将队列首个元素踢出。更新队列后，计算队列元素的平均值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>MovingAverage</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>Queue</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> queue</span></span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> size </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>long</span><span> queueSum </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>7</div></div><div><span>    </span><span>public</span><span> </span><span>MovingAverage</span><span>(</span><span>int</span><span><span> </span><span>size</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>this</span><span>.</span><span>size</span><span><span> </span><span>=</span><span> size;</span></span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>queue </span><span>=</span><span> </span><span>new</span><span> </span><span>ArrayDeque</span><span>();</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>double</span><span> </span><span>next</span><span>(</span><span>int</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>queueSum </span><span>+=</span><span> val;</span></div></div><div><div><div>14</div></div><div><span>        </span><span>queue</span><span>.</span><span>add</span><span>(val);</span></div></div><div><div><div>15</div></div><div><span>        </span><span>if</span><span> (</span><span>queue</span><span>.</span><span>size</span><span><span>() </span><span>&gt;</span><span> size) {</span></span></div></div><div><div><div>16</div></div><div><span>            </span><span>int</span><span><span> </span><span>front</span><span> </span></span><span><span>=</span><span> </span></span><span>queue</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>queueSum </span><span>-=</span><span> front;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> (</span><span>double</span><span><span>)queueSum </span><span>/</span><span> </span></span><span>queue</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>347. Top K Frequent Elements<a href="#347-top-k-frequent-elements"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/top-k-frequent-elements/" target="_blank">https://leetcode.com/problems/top-k-frequent-elements/</a></p><hr /><p>统计每个数出现的次数。再使用一个桶，对每一个出现频数，存储哪些数字出现了这么多次。最后再按照频数的大小，从大到小添加<code>k</code>个数字即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>topKFrequent</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;[] </span><span>bucket</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>List</span><span>[</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>5</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// frequency map</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span></span><span>:</span><span> nums) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(num, </span><span>map</span><span>.</span><span>getOrDefault</span><span>(num, </span><span>0</span><span><span>) </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// for each frequency, add corresponding number to the bucket</span></div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>key</span></span><span>:</span><span> </span><span>map</span><span>.</span><span>keySet</span><span>()) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>int</span><span><span> </span><span>frequency</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>get</span><span>(key);</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span><span> (bucket[frequency] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>bucket[frequency] </span><span>=</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>bucket[frequency].</span><span>add</span><span>(key);</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>// get result from bucket</span></div></div><div><div><div>22</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>pos</span><span> </span></span><span><span>=</span><span> </span></span><span>bucket</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span>; pos </span><span>&gt;=</span><span> </span></span><span>0</span><span>; pos--) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>if</span><span><span> (bucket[pos] </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> bucket[pos].</span></span><span>size</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>result</span><span>.</span><span>size</span><span><span>() </span><span>&lt;</span><span> k; i++) {</span></span></div></div><div><div><div>25</div></div><div><span>                    </span><span>result</span><span>.</span><span>add</span><span>(bucket[pos].</span><span>get</span><span>(i));</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>arrayResult</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>result</span><span>.</span><span>size</span><span>()];</span></div></div><div><div><div>30</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>result</span><span>.</span><span>size</span><span>(); i++) {</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>arrayResult[i] </span><span>=</span><span> </span><span>result</span><span>.</span><span>get</span><span>(i);</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>return</span><span> arrayResult;</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>348. Design Tic-Tac-Toe<a href="#348-design-tic-tac-toe"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/design-tic-tac-toe/" target="_blank">https://leetcode.com/problems/design-tic-tac-toe/</a></p><hr /><p>每下一子，会影响这一子所在的行、列以及双对角线（如果这一子恰好落在双对角线之一上），因此只需要跟踪这四条线的情况即可。可以使用两个数组检查所有<code>row</code>和<code>col</code>的情况，再使用两个变量跟踪双对角线。假设player1下一子，当前所在行/列/双对角线的值就+1，而player2下一子，当前所在行/列/双对角线的值就-1。每次下完一子后，检查这四条线的值，如果某一条绝对值等于棋盘大小<code>size</code>，说明这条线都是其中一名player的棋子，这个player胜利。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>TicTacToe</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] rows</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] cols</span><span>;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> diagonal</span><span>;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> antiDiagonal</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>10</div></div><div><span>    </span><span>public</span><span> </span><span>TicTacToe</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>rows </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>cols </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>/** Player {player} makes a move at ({row}, {col}).</span></div></div><div><div><div>16</div></div><div><span>        </span><span>@param</span><span> </span><span>row</span><span> The row of the board.</span></div></div><div><div><div>17</div></div><div><span>        </span><span>@param</span><span> </span><span>col</span><span> The column of the board.</span></div></div><div><div><div>18</div></div><div><span>        </span><span>@param</span><span> </span><span>player</span><span> The player, can be either 1 or 2.</span></div></div><div><div><div>19</div></div><div><span>        </span><span>@return</span><span> The current winning condition, can be either:</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>0: No one wins.</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>1: Player 1 wins.</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>2: Player 2 wins. */</span></div></div><div><div><div>23</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>move</span><span>(</span><span>int</span><span><span> </span><span>row</span><span>, </span></span><span>int</span><span><span> </span><span>col</span><span>, </span></span><span>int</span><span><span> </span><span>player</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>int</span><span><span> </span><span>toAdd</span><span> </span></span><span><span>=</span><span> player </span><span>==</span><span> </span></span><span>1</span><span> </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>// add current chess and update the status</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>rows[row] </span><span>+=</span><span> toAdd;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>cols[col] </span><span>+=</span><span> toAdd;</span></div></div><div><div><div>29</div></div><div><span>        </span><span>if</span><span><span> (row </span><span>==</span><span> col) {</span></span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>diagonal </span><span>+=</span><span> toAdd;</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>        </span><span>if</span><span><span> (row </span><span>+</span><span> col </span><span>==</span><span> </span></span><span>cols</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>antiDiagonal </span><span>+=</span><span> toAdd;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>int</span><span><span> </span><span>size</span><span> </span></span><span><span>=</span><span> </span></span><span>rows</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>// one of the players fills a row / col / cross diagonal</span></div></div><div><div><div>39</div></div><div><span>        </span><span>if</span><span> (</span><span>Math</span><span>.</span><span>abs</span><span><span>(rows[row]) </span><span>==</span><span> size </span><span>||</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(cols[col]) </span><span>==</span><span> size </span><span>||</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(diagonal) </span><span>==</span><span> size </span><span>||</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(antiDiagonal) </span><span>==</span><span> size) {</span></span></div></div><div><div><div>40</div></div><div><span>            </span><span>return</span><span> player;</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>        </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>349. Intersection of Two Arrays<a href="#349-intersection-of-two-arrays"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/intersection-of-two-arrays/" target="_blank">https://leetcode.com/problems/intersection-of-two-arrays/</a></p><hr /><p>使用一个Set，先遍历<code>nums1</code>将所有数存进Set，再遍历<code>nums2</code>的每个数，看Set中能不能删掉这个数。如果这个数能被删掉，说明这个数在<code>nums1</code>和<code>nums2</code>中都出现了，因此添加到答案中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>intersection</span><span>(</span><span>int</span><span><span>[] </span><span>nums1</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>set</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums1) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>set</span><span>.</span><span>add</span><span>(num);</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>set</span><span>.</span><span>size</span><span>()];</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums2) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>// current num is in both num1 and num2</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span> (</span><span>set</span><span>.</span><span>remove</span><span>(num)) {</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>result[count] </span><span>=</span><span> num;</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>count++;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>// copy all intersections</span></div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> </span><span>Arrays</span><span>.</span><span>copyOfRange</span><span>(result, </span><span>0</span><span>, count);</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>350. Intersection of Two Arrays II<a href="#350-intersection-of-two-arrays-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/intersection-of-two-arrays-ii/" target="_blank">https://leetcode.com/problems/intersection-of-two-arrays-ii/</a></p><hr /><p>使用map，先统计<code>nums1</code>中每个数出现了多少次，之后遍历<code>nums2</code>，如果发现了一个数重复，就加到结果，同时把map里这个数的频数-1，以此保证能出现完全一样的次数。</p><p>Follow-ups:</p><ul>
<li>如果两个数组已经排好序，直接使用双指针法同时遍历两个数组，类似于mergesort的流程</li>
<li>如果<code>nums1</code>的长度比起<code>nums2</code>小了很多，并且仍然是排好序的情况下，可以考虑使用二分搜索；否则，应该使用小数组作为哈希计数表</li>
<li>如果<code>nums1</code>较小，可以将<code>nums1</code>中的元素放入哈希表，每一次从中读一个chunk的大小（视内存而定），记录所有的intersections。而如果<code>nums1</code>也较大，要么使用MapReduce，要么使用streaming</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>intersect</span><span>(</span><span>int</span><span><span>[] </span><span>nums1</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// occurrence map</span></div></div><div><div><div>4</div></div><div><span>        </span><span>HashMap</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span>:</span><span> nums1) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>int</span><span><span> </span><span>freq</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>getOrDefault</span><span>(i, </span><span>0</span><span>);</span></div></div><div><div><div>7</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span><span>(i, freq </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>nums1</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>ArrayList</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>list</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span>:</span><span> nums2) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>int</span><span><span> </span><span>currentNumFreq</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>getOrDefault</span><span>(i, </span><span>0</span><span>);</span></div></div><div><div><div>16</div></div><div><span>            </span><span>if</span><span><span> (currentNumFreq </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>result[count] </span><span>=</span><span> i;</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>count++;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>                </span><span>// update occurrence to ensure as many times as appearance in both arrays</span></div></div><div><div><div>21</div></div><div><span>                </span><span>map</span><span>.</span><span>put</span><span><span>(i, currentNumFreq </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> </span><span>Arrays</span><span>.</span><span>copyOfRange</span><span>(result, </span><span>0</span><span>, count);</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>351. Android Unlock Patterns<a href="#351-android-unlock-patterns"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/android-unlock-patterns/" target="_blank">https://leetcode.com/problems/android-unlock-patterns/</a></p><hr /><p>使用一个缓存数组，对于所有的key数量，存储共有多少种图案。再使用dfs，每一次迭代传入当前的起始位置以及当前使用的key数量，再遍历其他所有可能的结束位置，如果起始 -&gt; 结束的路径合法，就进入下一组迭代，模拟下一步。注意在模拟下一步之前，需要记录当前已经过数字的访问情况。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>// for each key number, the total count of unlock patterns</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] cache</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>boolean</span><span>[] visited </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span> [</span><span>10</span><span><span>]</span><span>;</span></span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>numberOfPatterns</span><span>(</span><span>int</span><span><span> </span><span>m</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>if</span><span><span> (cache </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>cache </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span>[</span><span>10</span><span>];</span></div></div><div><div><div>10</div></div><div><span>            </span><span>dfs</span><span>(</span><span>0</span><span>, </span><span>0</span><span>);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>// cumulative result</span></div></div><div><div><div>13</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>10</span><span>; i++) {</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>cache[i] </span><span>+=</span><span> cache[i</span><span>-</span><span>1</span><span>];</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span><span> cache[n] </span><span>-</span><span> cache[m</span><span>-</span></span><span>1</span><span>];</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>keyNum</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span><span> (keyNum </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>cache[keyNum]++;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>y</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; y </span><span>&lt;</span><span> </span></span><span>10</span><span>; y++) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>if</span><span> (visited[y]) {</span></div></div><div><div><div>28</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>            </span><span>if</span><span><span> (keyNum </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>validX2Y</span><span>(x, y)) {</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>visited[y] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>33</div></div><div><span>                </span><span>dfs</span><span><span>(y, keyNum </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>visited[y] </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>            </span><span>// exploit the symmetries</span></div></div><div><div><div>38</div></div><div><span>            </span><span>if</span><span><span> (keyNum </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>39</div></div><div><span>                </span><span>if</span><span><span> (y </span><span>==</span><span> </span></span><span>5</span><span>) {</span></div></div><div><div><div>40</div></div><div><span>                    </span><span>break</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>                </span><span>if</span><span><span> (y </span><span>==</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>43</div></div><div><span><span>                    </span></span><span>y </span><span>+=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>44</div></div><div><span>                    </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>10</span><span>; i++) {</span></div></div><div><div><div>45</div></div><div><span><span>                        </span></span><span>cache[i] </span><span>*=</span><span> </span><span>4</span><span>;</span></div></div><div><div><div>46</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>    </span><span>// decide if route from number x -&gt; number y is valid</span></div></div><div><div><div>53</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>validX2Y</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>54</div></div><div><span>        </span><span>// start / end is center, which must be valid</span></div></div><div><div><div>55</div></div><div><span>        </span><span>if</span><span><span> (x </span><span>==</span><span> </span></span><span>5</span><span><span> </span><span>||</span><span> y </span><span>==</span><span> </span></span><span>5</span><span>) {</span></div></div><div><div><div>56</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>57</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span>        </span><span>// one number is 2/4/6/8, should not reach the other side without crossing center</span></div></div><div><div><div>60</div></div><div><span>        </span><span>if</span><span><span> (x </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> y </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>61</div></div><div><span>            </span><span>return</span><span><span> x </span><span>+</span><span> y </span><span>!=</span><span> </span></span><span>10</span><span><span> </span><span>||</span><span> visited[</span></span><span>5</span><span>];</span></div></div><div><div><div>62</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>63</div></div><div>
</div></div><div><div><div>64</div></div><div><span>        </span><span>// two numbers are both odd numbers, must cross the median number</span></div></div><div><div><div>65</div></div><div><span>        </span><span>return</span><span><span> visited[(x </span><span>+</span><span> y) </span><span>/</span><span> </span></span><span>2</span><span>];</span></div></div><div><div><div>66</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>67</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>352. Data Stream as Disjoint Intervals<a href="#352-data-stream-as-disjoint-intervals"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/data-stream-as-disjoint-intervals/" target="_blank">https://leetcode.com/problems/data-stream-as-disjoint-intervals/</a></p><hr /><p>使用一个TreeMap，每个pair的key和value分别对应区间的两个端点。利用TreeMap特性，找到最接近的上下两个key，分类讨论当前插入的数是否需要跟邻近区间合并。如果不能合并，则当作一个新区间插入。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>SummaryRanges</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>TreeMap</span><span>&lt;</span><span>Integer</span><span><span>,</span><span> </span></span><span>Integer</span><span><span>&gt;</span><span> tree</span></span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>SummaryRanges</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>tree </span><span>=</span><span> </span><span>new</span><span> </span><span>TreeMap</span><span>&lt;&gt;();</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>addNum</span><span>(</span><span>int</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>11</div></div><div><span>        </span><span>if</span><span> (</span><span>tree</span><span>.</span><span>containsKey</span><span>(val)) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// the least key strictly greater than the given key, or null</span></div></div><div><div><div>16</div></div><div><span>        </span><span>Integer</span><span><span> </span><span>ceil</span><span> </span></span><span><span>=</span><span> </span></span><span>tree</span><span>.</span><span>higherKey</span><span>(val);</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>// the greatest key strictly less than to given key, or null</span></div></div><div><div><div>19</div></div><div><span>        </span><span>Integer</span><span><span> </span><span>floor</span><span> </span></span><span><span>=</span><span> </span></span><span>tree</span><span>.</span><span>lowerKey</span><span>(val);</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>// current number is a middle value between the other two, eg. insert 2 between 1, 3</span></div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span><span> (ceil </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> floor </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> val </span><span>==</span><span> </span></span><span>tree</span><span>.</span><span>get</span><span><span>(floor) </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> val </span><span>==</span><span>  ceil </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>// modify floor pair and remove ceil pair to merge</span></div></div><div><div><div>24</div></div><div><span>            </span><span>tree</span><span>.</span><span>put</span><span>(floor, </span><span>tree</span><span>.</span><span>get</span><span>(ceil));</span></div></div><div><div><div>25</div></div><div><span>            </span><span>tree</span><span>.</span><span>remove</span><span>(ceil);</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (floor </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> val </span><span>&lt;=</span><span> </span></span><span>tree</span><span>.</span><span>get</span><span><span>(floor) </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>// merge with a smaller interval</span></div></div><div><div><div>28</div></div><div><span>            </span><span>tree</span><span>.</span><span>put</span><span>(floor, </span><span>Math</span><span>.</span><span>max</span><span>(val, </span><span>tree</span><span>.</span><span>get</span><span>(floor)));</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (ceil </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> val </span><span>&gt;=</span><span> ceil </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>30</div></div><div><span>            </span><span>// merge with a greater internal, and remove duplicate interval if necessary</span></div></div><div><div><div>31</div></div><div><span>            </span><span>tree</span><span>.</span><span>put</span><span>(val, </span><span>tree</span><span>.</span><span>get</span><span>(ceil));</span></div></div><div><div><div>32</div></div><div><span>            </span><span>if</span><span><span> (ceil </span><span>!=</span><span> val) {</span></span></div></div><div><div><div>33</div></div><div><span>                </span><span>tree</span><span>.</span><span>remove</span><span>(ceil);</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>36</div></div><div><span>            </span><span>// a new number, insert as a self disjoint interval</span></div></div><div><div><div>37</div></div><div><span>            </span><span>tree</span><span>.</span><span>put</span><span>(val, val);</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[][] </span><span>getIntervals</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>42</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>tree</span><span>.</span><span>size</span><span>()][</span><span>2</span><span>];</span></div></div><div><div><div>43</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>44</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>n</span><span> </span></span><span>:</span><span> </span><span>tree</span><span>.</span><span>keySet</span><span>()) {</span></div></div><div><div><div>45</div></div><div><span><span>            </span></span><span>result[i][</span><span>0</span><span><span>] </span><span>=</span><span> n;</span></span></div></div><div><div><div>46</div></div><div><span><span>            </span></span><span>result[i][</span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>tree</span><span>.</span><span>get</span><span>(n);</span></div></div><div><div><div>47</div></div><div><span><span>            </span></span><span>i++;</span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>51</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>52</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>353. Design Snake Game<a href="#353-design-snake-game"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/design-snake-game/" target="_blank">https://leetcode.com/problems/design-snake-game/</a></p><hr /><p>定义一个Point类表示每个点的坐标，再用Point链表表示蛇，如果蛇吃到了食物，就在链表头增加一格，表示蛇在当前位置变长，并且游戏分数+1。只有确保当前的分数仍然小于总的食物个数时，才生成下一个食物。此外需要注意蛇移动时，不能出边界或咬到自己。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>SnakeGame</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>class</span><span><span> </span><span>Position</span><span> </span></span><span>{</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span> x</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span> y</span><span>;</span></div></div><div><div><div>6</div></div><div><span>        </span><span>public</span><span> </span><span>Position</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>this</span><span>.</span><span>x</span><span><span> </span><span>=</span><span> x;</span></span></div></div><div><div><div>8</div></div><div><span>            </span><span>this</span><span>.</span><span>y</span><span><span> </span><span>=</span><span> y;</span></span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>        </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isEqual</span><span>(</span><span>Position</span><span><span> </span><span>p</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>11</div></div><div><span>            </span><span>return</span><span> </span><span>this</span><span>.</span><span>x</span><span><span> </span><span>==</span><span> </span></span><span>p</span><span>.</span><span>x</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>this</span><span>.</span><span>y</span><span><span> </span><span>==</span><span> </span></span><span>p</span><span>.</span><span>y</span><span> ;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> score</span><span>;</span></div></div><div><div><div>16</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span><span> rows</span><span>,</span><span> cols</span></span><span>;</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[][] food</span><span>;</span></div></div><div><div><div>19</div></div><div><span>    </span><span>LinkedList</span><span>&lt;</span><span>Position</span><span><span>&gt;</span><span> snake</span></span><span>;</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here.</span></div></div><div><div><div>22</div></div><div><span>            </span><span>@param</span><span> </span><span>width</span><span> - screen width</span></div></div><div><div><div>23</div></div><div><span>            </span><span>@param</span><span> </span><span>height</span><span> - screen height</span></div></div><div><div><div>24</div></div><div><span>            </span><span>@param</span><span> </span><span>food</span><span> - A list of food positions</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>E.g food = [[1,1], [1,0]] means the first food is positioned at [1,1], the second is at [1,0]. */</span></div></div><div><div><div>26</div></div><div><span>    </span><span>public</span><span> </span><span>SnakeGame</span><span>(</span><span>int</span><span><span> </span><span>width</span><span>, </span></span><span>int</span><span><span> </span><span>height</span><span>, </span></span><span>int</span><span><span>[][] </span><span>food</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>this</span><span>.</span><span>rows</span><span><span> </span><span>=</span><span> height;</span></span></div></div><div><div><div>28</div></div><div><span>        </span><span>this</span><span>.</span><span>cols</span><span><span> </span><span>=</span><span> width;</span></span></div></div><div><div><div>29</div></div><div><span>        </span><span>this</span><span>.</span><span>food</span><span><span> </span><span>=</span><span> food;</span></span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>// The snake is initially positioned at the top left corner (0,0)</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>snake </span><span>=</span><span> </span><span>new</span><span> </span><span>LinkedList</span><span>&lt;</span><span>Position</span><span>&gt;();</span></div></div><div><div><div>33</div></div><div><span>        </span><span>snake</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>Position</span><span>(</span><span>0</span><span>,</span><span>0</span><span>));</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>score </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>/** Moves the snake.</span></div></div><div><div><div>38</div></div><div><span>            </span><span>@param</span><span> </span><span>direction</span><span> - 'U' = Up, 'L' = Left, 'R' = Right, 'D' = Down</span></div></div><div><div><div>39</div></div><div><span>            </span><span>@return</span><span> The game's score after the move. Return -1 if game over.</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>Game over when snake crosses the screen boundary or bites its body. */</span></div></div><div><div><div>41</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>move</span><span>(</span><span>String</span><span><span> </span><span>direction</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>42</div></div><div><span>        </span><span>Position</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Position</span><span>(</span><span>snake</span><span>.</span><span>get</span><span>(</span><span>0</span><span>).</span><span>x</span><span>, </span><span>snake</span><span>.</span><span>get</span><span>(</span><span>0</span><span>).</span><span>y</span><span>);</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>        </span><span>switch</span><span>(direction) {</span></div></div><div><div><div>45</div></div><div><span>            </span><span>case</span><span> </span><span>"U"</span><span>:</span></div></div><div><div><div>46</div></div><div><span>                </span><span>cur</span><span>.</span><span>x</span><span>--;  </span><span>break</span><span>;</span></div></div><div><div><div>47</div></div><div><span>            </span><span>case</span><span> </span><span>"L"</span><span>:</span></div></div><div><div><div>48</div></div><div><span>                </span><span>cur</span><span>.</span><span>y</span><span>--; </span><span>break</span><span>;</span></div></div><div><div><div>49</div></div><div><span>            </span><span>case</span><span> </span><span>"R"</span><span>:</span></div></div><div><div><div>50</div></div><div><span>                </span><span>cur</span><span>.</span><span>y</span><span>++;   </span><span>break</span><span>;</span></div></div><div><div><div>51</div></div><div><span>            </span><span>case</span><span> </span><span>"D"</span><span>:</span></div></div><div><div><div>52</div></div><div><span>                </span><span>cur</span><span>.</span><span>x</span><span>++;   </span><span>break</span><span>;</span></div></div><div><div><div>53</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>54</div></div><div>
</div></div><div><div><div>55</div></div><div><span>        </span><span>// out of bound</span></div></div><div><div><div>56</div></div><div><span>        </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>x</span><span><span> </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>cur</span><span>.</span><span>x</span><span><span> </span><span>&gt;=</span><span> rows </span><span>||</span><span> </span></span><span>cur</span><span>.</span><span>y</span><span><span> </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>cur</span><span>.</span><span>y</span><span><span> </span><span>&gt;=</span><span> cols) {</span></span></div></div><div><div><div>57</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>58</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>59</div></div><div>
</div></div><div><div><div>60</div></div><div><span>        </span><span>// bite self</span></div></div><div><div><div>61</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>snake</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>62</div></div><div><span>            </span><span>Position</span><span><span> </span><span>next</span><span> </span></span><span><span>=</span><span> </span></span><span>snake</span><span>.</span><span>get</span><span>(i);</span></div></div><div><div><div>63</div></div><div><span>            </span><span>if</span><span> (</span><span>next</span><span>.</span><span>isEqual</span><span>(cur)) {</span></div></div><div><div><div>64</div></div><div><span>                </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>65</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>66</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>67</div></div><div>
</div></div><div><div><div>68</div></div><div><span>        </span><span>// add one size at current food's location</span></div></div><div><div><div>69</div></div><div><span>        </span><span>snake</span><span>.</span><span>addFirst</span><span>(cur);</span></div></div><div><div><div>70</div></div><div>
</div></div><div><div><div>71</div></div><div><span>        </span><span>// guarantee that there should still be enough food</span></div></div><div><div><div>72</div></div><div><span>        </span><span>if</span><span><span> (score </span><span>&lt;</span><span> </span></span><span>food</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>73</div></div><div><span>            </span><span>Position</span><span><span> </span><span>p</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Position</span><span>(food[score][</span><span>0</span><span>], food[score][</span><span>1</span><span>]);</span></div></div><div><div><div>74</div></div><div><span>            </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>isEqual</span><span>(p)) {</span></div></div><div><div><div>75</div></div><div><span><span>                </span></span><span>score++;</span></div></div><div><div><div>76</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>77</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>78</div></div><div>
</div></div><div><div><div>79</div></div><div><span>        </span><span>while</span><span> (</span><span>snake</span><span>.</span><span>size</span><span><span>() </span><span>&gt;</span><span> score </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>80</div></div><div><span>            </span><span>snake</span><span>.</span><span>removeLast</span><span>();</span></div></div><div><div><div>81</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>82</div></div><div>
</div></div><div><div><div>83</div></div><div><span>        </span><span>return</span><span> score;</span></div></div><div><div><div>84</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>85</div></div><div><span>}</span></div></div><div><div><div>86</div></div><div>
</div></div><div><div><div>87</div></div><div><span>/**</span></div></div><div><div><div>88</div></div><div><span><span> </span></span><span>* Your SnakeGame object will be instantiated and called as such:</span></div></div><div><div><div>89</div></div><div><span><span> </span></span><span>* SnakeGame obj = new SnakeGame(width, height, food);</span></div></div><div><div><div>90</div></div><div><span><span> </span></span><span>* int param_1 = obj.move(direction);</span></div></div><div><div><div>91</div></div><div><span><span> </span></span><span>*/</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>354. Russian Doll Envelopes<a href="#354-russian-doll-envelopes"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/russian-doll-envelopes/" target="_blank">https://leetcode.com/problems/russian-doll-envelopes/</a></p><hr /><p>先按照宽度对所有信封进行升序排序，如果宽度一样再按照高度降序排序（否则会产生关于高度的递增序列）。之后，求出关于高度序列的最长递增序列。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxEnvelopes</span><span>(</span><span>int</span><span><span>[][] </span><span>envelopes</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (envelopes </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>envelopes</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> envelopes[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>!=</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// sort by width in ascending order</span></div></div><div><div><div>8</div></div><div><span>        </span><span>// sort by height in descending order if width are equal</span></div></div><div><div><div>9</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(envelopes, </span><span>new</span><span> </span><span>Comparator</span><span>&lt;</span><span>int</span><span>[]&gt;() {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>public</span><span> </span><span>int</span><span> </span><span>compare</span><span>(</span><span>int</span><span><span>[] </span><span>arr1</span><span>, </span></span><span>int</span><span><span>[] </span><span>arr2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>11</div></div><div><span>                </span><span>return</span><span> arr1[</span><span>0</span><span><span>] </span><span>==</span><span> arr2[</span></span><span>0</span><span>] </span><span>?</span><span> arr2[</span><span>1</span><span><span>] </span><span>-</span><span> arr1[</span></span><span>1</span><span>] </span><span>:</span><span> arr1[</span><span>0</span><span><span>] </span><span>-</span><span> arr2[</span></span><span>0</span><span>];</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>});</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// Find the longest increasing subsequence based on height.</span></div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span> </span><span>dp</span><span>[] </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>envelopes</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>17</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>envelope</span><span> </span></span><span>:</span><span> envelopes) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>Arrays</span><span>.</span><span>binarySearch</span><span>(dp, </span><span>0</span><span>, result, envelope[</span><span>1</span><span>]);</span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span><span> (index </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>index </span><span>=</span><span> </span><span>-</span><span>(index </span><span>+</span><span> </span><span>1</span><span>);</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>dp[index] </span><span>=</span><span> envelope[</span><span>1</span><span>];</span></div></div><div><div><div>25</div></div><div><span>            </span><span>if</span><span><span> (index </span><span>==</span><span> result) {</span></span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>result++;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>355. Design Twitter<a href="#355-design-twitter"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/design-twitter/" target="_blank">https://leetcode.com/problems/design-twitter/</a></p><hr /><p>设计一个<code>User</code>类，每一个用户存储用户ID，关注的所有用户的列表，以及发过的所有<code>Tweet</code>链表的头（如果没发过，就是null）。每一个<code>Tweet</code>类instance则相当于一个链表的节点，尤其注意其中存储了下一个<code>Tweet</code>节点的指针。这样设计的目的是在<code>getNewsFeed()</code>时，可以利用优先队列快速的对当前用户能看到的所有tweet按照时间戳进行排序。</p><p>此外，在用户关注/取消关注时，要注意到可能输入的无效测试样例（例如某个<code>follwerId</code>不存在），这时候需要先创建这个<code>User</code>，再记录到userMap中，之后才继续进行相关操作。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Twitter</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>static</span><span> </span><span>int</span><span> timeStamp </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>Integer</span><span><span>,</span><span> </span></span><span>User</span><span><span>&gt;</span><span> userMap</span></span><span><span>;</span><span> </span></span><span>// user id -&gt; User</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>private</span><span> </span><span>class</span><span><span> </span><span>Tweet</span><span> </span></span><span>{</span></div></div><div><div><div>7</div></div><div><span>        </span><span>public</span><span> </span><span>int</span><span> id</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>public</span><span> </span><span>int</span><span> time</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>public</span><span> </span><span>Tweet</span><span> next</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>public</span><span> </span><span>Tweet</span><span>(</span><span>int</span><span><span> </span><span>id</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>this</span><span>.</span><span>id</span><span><span> </span><span>=</span><span> id;</span></span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>time </span><span>=</span><span> timeStamp++;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>next </span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>    </span><span>public</span><span> </span><span>class</span><span><span> </span><span>User</span><span> </span></span><span>{</span></div></div><div><div><div>19</div></div><div><span>        </span><span>public</span><span> </span><span>int</span><span> id</span><span>;</span></div></div><div><div><div>20</div></div><div><span>        </span><span>public</span><span> </span><span>Set</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> followed</span></span><span>;</span></div></div><div><div><div>21</div></div><div><span>        </span><span>public</span><span> </span><span>Tweet</span><span> tweet_head</span><span>;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>public</span><span> </span><span>User</span><span>(</span><span>int</span><span><span> </span><span>id</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>            </span><span>this</span><span>.</span><span>id</span><span><span> </span><span>=</span><span> id;</span></span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>followed </span><span>=</span><span> </span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>26</div></div><div><span>            </span><span>follow</span><span>(id); </span><span>// first follow self</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>tweet_head </span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>public</span><span> </span><span>void</span><span> </span><span>follow</span><span>(</span><span>int</span><span><span> </span><span>id</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>            </span><span>followed</span><span>.</span><span>add</span><span>(id);</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>public</span><span> </span><span>void</span><span> </span><span>unfollow</span><span>(</span><span>int</span><span><span> </span><span>id</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>35</div></div><div><span>            </span><span>followed</span><span>.</span><span>remove</span><span>(id);</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>// everytime user post a new tweet, add it to the head of tweet list.</span></div></div><div><div><div>39</div></div><div><span>        </span><span>public</span><span> </span><span>void</span><span> </span><span>post</span><span>(</span><span>int</span><span><span> </span><span>id</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>40</div></div><div><span>            </span><span>Tweet</span><span><span> </span><span>t</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Tweet</span><span>(id);</span></div></div><div><div><div>41</div></div><div><span>            </span><span>t</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> tweet_head;</span></span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>tweet_head </span><span>=</span><span> t;</span></div></div><div><div><div>43</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>47</div></div><div><span>    </span><span>public</span><span> </span><span>Twitter</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>userMap </span><span>=</span><span> </span><span>new</span><span> </span><span>HashMap</span><span>&lt;</span><span>Integer</span><span>, </span><span>User</span><span>&gt;();</span></div></div><div><div><div>49</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span><span>    </span></span><span>/** Compose a new tweet. */</span></div></div><div><div><div>52</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>postTweet</span><span>(</span><span>int</span><span><span> </span><span>userId</span><span>, </span></span><span>int</span><span><span> </span><span>tweetId</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>53</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>userMap</span><span>.</span><span>containsKey</span><span>(userId)) {</span></div></div><div><div><div>54</div></div><div><span>            </span><span>User</span><span><span> </span><span>u</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>User</span><span>(userId);</span></div></div><div><div><div>55</div></div><div><span>            </span><span>userMap</span><span>.</span><span>put</span><span>(userId, u);</span></div></div><div><div><div>56</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>57</div></div><div><span>        </span><span>userMap</span><span>.</span><span>get</span><span>(userId).</span><span>post</span><span>(tweetId);</span></div></div><div><div><div>58</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>59</div></div><div>
</div></div><div><div><div>60</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>getNewsFeed</span><span>(</span><span>int</span><span><span> </span><span>userId</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>61</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>62</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>userMap</span><span>.</span><span>containsKey</span><span>(userId)) {</span></div></div><div><div><div>63</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>64</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>65</div></div><div>
</div></div><div><div><div>66</div></div><div><span>        </span><span>// get all tweets lists from one user including itself and all people it followed.</span></div></div><div><div><div>67</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>users</span><span> </span></span><span><span>=</span><span> </span></span><span>userMap</span><span>.</span><span>get</span><span>(userId).</span><span>followed</span><span>;</span></div></div><div><div><div>68</div></div><div>
</div></div><div><div><div>69</div></div><div><span>        </span><span>// add all heads into a max heap of timestamp. Every time we poll a tweet from the heap, add its next into the heap.</span></div></div><div><div><div>70</div></div><div><span>        </span><span>// sort by timestamp</span></div></div><div><div><div>71</div></div><div><span>        </span><span>PriorityQueue</span><span>&lt;</span><span>Tweet</span><span><span>&gt; </span><span>q</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;</span><span>Tweet</span><span>&gt;(</span><span>users</span><span>.</span><span>size</span><span>(), (a,b) </span><span>-&gt;</span><span> (</span><span>b</span><span>.</span><span>time</span><span><span> </span><span>-</span><span> </span></span><span>a</span><span>.</span><span>time</span><span>));</span></div></div><div><div><div>72</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>user</span></span><span>:</span><span> users) {</span></div></div><div><div><div>73</div></div><div><span>            </span><span>Tweet</span><span><span> </span><span>t</span><span> </span></span><span><span>=</span><span> </span></span><span>userMap</span><span>.</span><span>get</span><span>(user).</span><span>tweet_head</span><span>;</span></div></div><div><div><div>74</div></div><div><span>            </span><span>if</span><span><span> (t </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>75</div></div><div><span>                </span><span>// make sure current user has posted something</span></div></div><div><div><div>76</div></div><div><span>                </span><span>q</span><span>.</span><span>add</span><span>(t);</span></div></div><div><div><div>77</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>78</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>79</div></div><div>
</div></div><div><div><div>80</div></div><div><span>        </span><span>// poll at most 10 tweets from the priority queue</span></div></div><div><div><div>81</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>82</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>q</span><span>.</span><span>isEmpty</span><span><span>() </span><span>&amp;&amp;</span><span> n </span><span>&lt;</span><span> </span></span><span>10</span><span>) {</span></div></div><div><div><div>83</div></div><div><span>            </span><span>Tweet</span><span><span> </span><span>t</span><span> </span></span><span><span>=</span><span> </span></span><span>q</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>84</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>t</span><span>.</span><span>id</span><span>);</span></div></div><div><div><div>85</div></div><div><span><span>            </span></span><span>n++;</span></div></div><div><div><div>86</div></div><div>
</div></div><div><div><div>87</div></div><div><span>            </span><span>// make sure current tweet has next tweet</span></div></div><div><div><div>88</div></div><div><span>            </span><span>if</span><span> (</span><span>t</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>89</div></div><div><span>                </span><span>q</span><span>.</span><span>add</span><span>(</span><span>t</span><span>.</span><span>next</span><span>);</span></div></div><div><div><div>90</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>91</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>92</div></div><div>
</div></div><div><div><div>93</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>94</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>95</div></div><div>
</div></div><div><div><div>96</div></div><div><span>    </span><span>/* Follower follows a followee. If the operation is invalid, it should be a no-op. */</span></div></div><div><div><div>97</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>follow</span><span>(</span><span>int</span><span><span> </span><span>followerId</span><span>, </span></span><span>int</span><span><span> </span><span>followeeId</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>98</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>userMap</span><span>.</span><span>containsKey</span><span>(followerId)) {</span></div></div><div><div><div>99</div></div><div><span>            </span><span>User</span><span><span> </span><span>u</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>User</span><span>(followerId);</span></div></div><div><div><div>100</div></div><div><span>            </span><span>userMap</span><span>.</span><span>put</span><span>(followerId, u);</span></div></div><div><div><div>101</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>102</div></div><div>
</div></div><div><div><div>103</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>userMap</span><span>.</span><span>containsKey</span><span>(followeeId)) {</span></div></div><div><div><div>104</div></div><div><span>            </span><span>User</span><span><span> </span><span>u</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>User</span><span>(followeeId);</span></div></div><div><div><div>105</div></div><div><span>            </span><span>userMap</span><span>.</span><span>put</span><span>(followeeId, u);</span></div></div><div><div><div>106</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>107</div></div><div>
</div></div><div><div><div>108</div></div><div><span>        </span><span>userMap</span><span>.</span><span>get</span><span>(followerId).</span><span>follow</span><span>(followeeId);</span></div></div><div><div><div>109</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>110</div></div><div>
</div></div><div><div><div>111</div></div><div><span>    </span><span>/* Follower unfollows a followee. If the operation is invalid, it should be a no-op. */</span></div></div><div><div><div>112</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>unfollow</span><span>(</span><span>int</span><span><span> </span><span>followerId</span><span>, </span></span><span>int</span><span><span> </span><span>followeeId</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>113</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>userMap</span><span>.</span><span>containsKey</span><span><span>(followerId) </span><span>||</span><span> followerId </span><span>==</span><span> followeeId) {</span></span></div></div><div><div><div>114</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>115</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>116</div></div><div>
</div></div><div><div><div>117</div></div><div><span>        </span><span>userMap</span><span>.</span><span>get</span><span>(followerId).</span><span>unfollow</span><span>(followeeId);</span></div></div><div><div><div>118</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>119</div></div><div><span>}</span></div></div><div><div><div>120</div></div><div>
</div></div><div><div><div>121</div></div><div><span>/**</span></div></div><div><div><div>122</div></div><div><span><span> </span></span><span>* Your Twitter object will be instantiated and called as such:</span></div></div><div><div><div>123</div></div><div><span><span> </span></span><span>* Twitter obj = new Twitter();</span></div></div><div><div><div>124</div></div><div><span><span> </span></span><span>* obj.postTweet(userId,tweetId);</span></div></div><div><div><div>125</div></div><div><span><span> </span></span><span>* List&lt;Integer&gt; param_2 = obj.getNewsFeed(userId);</span></div></div><div><div><div>126</div></div><div><span><span> </span></span><span>* obj.follow(followerId,followeeId);</span></div></div><div><div><div>127</div></div><div><span><span> </span></span><span>* obj.unfollow(followerId,followeeId);</span></div></div><div><div><div>128</div></div><div><span><span> </span></span><span>*/</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>356. Line Reflection<a href="#356-line-reflection"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/line-reflection/" target="_blank">https://leetcode.com/problems/line-reflection/</a></p><hr /><p>重载一个Point类，用于比较两个点坐标是否相等。使用一个HashSet存储所有坐标。如果有一条直线能把所有点以自己为轴隔开，这些点必然两两轴对称，并且如果我们已知所有点横坐标的最小值和最大值，每一对对称点横坐标之和必然等于最小值和最大值的和。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isReflected</span><span>(</span><span>int</span><span><span>[][] </span><span>points</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>points</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>max</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>min</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>HashSet</span><span>&lt;</span><span>Point</span><span><span>&gt; </span><span>set</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>// find the minimum and maximum x-value of all points</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>p</span><span> </span></span><span>:</span><span> points) {</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>max </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(max, p[</span><span>0</span><span>]);</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>min </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(min, p[</span><span>0</span><span>]);</span></div></div><div><div><div>15</div></div><div><span>            </span><span>set</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>Point</span><span>(p[</span><span>0</span><span>], p[</span><span>1</span><span>]));</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>// this is actually twice the reflection axis coordinate</span></div></div><div><div><div>19</div></div><div><span>        </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> min </span><span>+</span><span> max;</span></span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> [] </span><span>p</span><span> </span></span><span>:</span><span> points) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>// y-value shoule be the same</span></div></div><div><div><div>23</div></div><div><span>            </span><span>Point</span><span><span> </span><span>ref</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Point</span><span><span>(sum </span><span>-</span><span> p[</span></span><span>0</span><span>], p[</span><span>1</span><span>]);</span></div></div><div><div><div>24</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>set</span><span>.</span><span>contains</span><span>(ref)) {</span></div></div><div><div><div>25</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>    </span><span>private</span><span> </span><span>class</span><span><span> </span><span>Point</span><span> </span></span><span>{</span></div></div><div><div><div>33</div></div><div><span>        </span><span>int</span><span> x</span><span>;</span></div></div><div><div><div>34</div></div><div><span>        </span><span>int</span><span> y</span><span>;</span></div></div><div><div><div>35</div></div><div><span>        </span><span>Point</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>36</div></div><div><span>            </span><span>this</span><span>.</span><span>x</span><span><span> </span><span>=</span><span> x;</span></span></div></div><div><div><div>37</div></div><div><span>            </span><span>this</span><span>.</span><span>y</span><span><span> </span><span>=</span><span> y;</span></span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>@</span><span>Override</span></div></div><div><div><div>41</div></div><div><span>        </span><span>public</span><span> </span><span>boolean</span><span> </span><span>equals</span><span>(</span><span>Object</span><span><span> </span><span>o</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>42</div></div><div><span>            </span><span>Point</span><span><span> </span><span>p</span><span> </span></span><span><span>=</span><span> (Point) o;</span></span></div></div><div><div><div>43</div></div><div><span>            </span><span>return</span><span> </span><span>this</span><span>.</span><span>x</span><span><span> </span><span>==</span><span> </span></span><span>p</span><span>.</span><span>x</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>this</span><span>.</span><span>y</span><span><span> </span><span>==</span><span> </span></span><span>p</span><span>.</span><span>y</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>@</span><span>Override</span></div></div><div><div><div>47</div></div><div><span>        </span><span>public</span><span> </span><span>int</span><span> </span><span>hashCode</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>48</div></div><div><span>            </span><span>return</span><span><span> x </span><span>*</span><span> </span></span><span>31</span><span><span> </span><span>+</span><span> y </span><span>*</span><span> </span></span><span>17</span><span>;</span></div></div><div><div><div>49</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>357. Count Numbers with Unique Digits<a href="#357-count-numbers-with-unique-digits"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/count-numbers-with-unique-digits/" target="_blank">https://leetcode.com/problems/count-numbers-with-unique-digits/</a></p><hr /><p>本质上是排列组合题。进行数学递推：</p><ul>
<li>如果<code>n</code>为1，有10个unique numbers，即0-9</li>
<li>如果<code>n</code>为2，有9*9个unique numbers，因为十位1-9，个位不能和十位重复，也只有9个选择</li>
<li>如果<code>n</code>为3，有9<em>9</em>8个unique numbers</li>
<li>…</li>
</ul><p>由于本题要求出0到10<sup>n</sup>范围的unique numbers数量，因此只需要将0~<code>n</code>的所有情况数量输出即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>countNumbersWithUniqueDigits</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>10</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>uniqueDigits</span><span> </span></span><span><span>=</span><span> </span></span><span>9</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>availableNumber</span><span> </span></span><span><span>=</span><span> </span></span><span>9</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>while</span><span><span> (n-- </span><span>&gt;</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> availableNumber </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>uniqueDigits </span><span>*=</span><span> availableNumber;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> uniqueDigits;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>availableNumber--;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>358. Rearrange String k Distance Apart<a href="#358-rearrange-string-k-distance-apart"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/rearrange-string-k-distance-apart/" target="_blank">https://leetcode.com/problems/rearrange-string-k-distance-apart/</a></p><hr /><p>先构造出全部字符的字符-&gt;频率表，得到出现次数最多的字母出现了几次，以及一共有几个这样的字母。有了这两个信息，可以判断出符合题意的字符串的最短长度是多少，因此能快速排除掉不符合题意的情况。之后，再构造频率-&gt;字符表，统计对于每个出现次数，分别有哪些字符。这样做的目的是方便输出构造字符串时，优先从出现次数多的字符开始构造。构造的过程默认按照k间隔填充字符串，注意如果下标超过原字符串长度时，要进行循环处理。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>rearrangeString</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (k </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> s;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// build char-&gt;frequency map</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// max character and how many characters with max frequency</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>max</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, maxCount </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>cnt</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>s</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>cnt[c </span><span>-</span><span> </span><span>'a'</span><span>]++;</span></div></div><div><div><div>16</div></div><div><span>            </span><span>if</span><span><span> (max </span><span>==</span><span> cnt[c </span><span>-</span><span> </span></span><span>'a'</span><span>]) {</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>maxCount++;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span><span> (max </span><span>&lt;</span><span> cnt[c </span><span>-</span><span> </span></span><span>'a'</span><span>]) {</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>max </span><span>=</span><span> cnt[c </span><span>-</span><span> </span><span>'a'</span><span>];</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>maxCount </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>// to hold all max count characters, we need at least such length</span></div></div><div><div><div>27</div></div><div><span>        </span><span>int</span><span><span> </span><span>leastLen</span><span> </span></span><span><span>=</span><span> (max </span><span>-</span><span> </span></span><span>1</span><span><span>) </span><span>*</span><span> k </span><span>+</span><span> maxCount;</span></span></div></div><div><div><div>28</div></div><div><span>        </span><span>if</span><span><span> (leastLen </span><span>&gt;</span><span> len) {</span></span></div></div><div><div><div>29</div></div><div><span>            </span><span>return</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>// build frequency-&gt;char map</span></div></div><div><div><div>33</div></div><div><span>        </span><span>LinkedList</span><span>&lt;</span><span>Integer</span><span><span>&gt;[] </span><span>freq</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span><span>[max </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>34</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> max </span><span>+</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>freq[i] </span><span>=</span><span> </span><span>new</span><span> </span><span>LinkedList</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>26</span><span>; i++) {</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>freq[cnt[i]].</span><span>add</span><span>(i);</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[len];</span></div></div><div><div><div>42</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> (len </span><span>-</span><span> </span></span><span>1</span><span><span>) </span><span>%</span><span> k;</span></span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>f</span><span> </span></span><span><span>=</span><span> max; f </span><span>&gt;</span><span> </span></span><span>0</span><span>; f--) {</span></div></div><div><div><div>45</div></div><div><span>            </span><span>while</span><span><span> (</span><span>!</span><span>freq[f].</span></span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>46</div></div><div><span>                </span><span>int</span><span><span> </span><span>cint</span><span> </span></span><span><span>=</span><span> freq[f].</span></span><span>remove</span><span>();</span></div></div><div><div><div>47</div></div><div><span>                </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> (</span></span><span>char</span><span><span>) (cint </span><span>+</span><span> </span></span><span>'a'</span><span>);</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>                </span><span>// dispatch current character with k as distance</span></div></div><div><div><div>50</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> f; j++) {</span></span></div></div><div><div><div>51</div></div><div><span><span>                    </span></span><span>result[i] </span><span>=</span><span> c;</span></div></div><div><div><div>52</div></div><div><span><span>                    </span></span><span>i </span><span>+=</span><span> k;</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span>                    </span><span>if</span><span><span> (i </span><span>&gt;=</span><span> len) {</span></span></div></div><div><div><div>55</div></div><div><span><span>                        </span></span><span>i </span><span>=</span><span> (i </span><span>-</span><span> </span><span>1</span><span><span>) </span><span>%</span><span> k;</span></span></div></div><div><div><div>56</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>57</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>58</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>59</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>60</div></div><div>
</div></div><div><div><div>61</div></div><div><span>        </span><span>return</span><span> </span><span>new</span><span> </span><span>String</span><span>(result);</span></div></div><div><div><div>62</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>63</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>359. Logger Rate Limiter<a href="#359-logger-rate-limiter"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/logger-rate-limiter/" target="_blank">https://leetcode.com/problems/logger-rate-limiter/</a></p><hr /><p>使用一个HashMap，记录message和最新的有效timestamp。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Logger</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>String</span><span><span>,</span><span> </span></span><span>Integer</span><span><span>&gt;</span><span> map</span></span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>Logger</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>map </span><span>=</span><span> </span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>/** Returns true if the message should be printed in the given timestamp, otherwise returns false.</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>If this method returns false, the message will not be printed.</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>The timestamp is in seconds granularity. */</span></div></div><div><div><div>13</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>shouldPrintMessage</span><span>(</span><span>int</span><span><span> </span><span>timestamp</span><span>, </span></span><span>String</span><span><span> </span><span>message</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>map</span><span>.</span><span>containsKey</span><span><span>(message) </span><span>||</span><span> timestamp </span><span>-</span><span> </span></span><span>map</span><span>.</span><span>get</span><span><span>(message) </span><span>&gt;=</span><span> </span></span><span>10</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(message, timestamp);</span></div></div><div><div><div>16</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>360. Sort Transformed Array<a href="#360-sort-transformed-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sort-transformed-array/" target="_blank">https://leetcode.com/problems/sort-transformed-array/</a></p><hr /><p>双指针法，一头一尾向中间逼近。分类讨论，如果<code>a</code>大于等于0，说明抛物线开口向上，此时两侧值较大，因此按照从大到小的顺序获取数组；如果<code>a</code>小于0，说明抛物线开口向下，此时两侧值较小，因此按照从小到大的顺序获取数组。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>quad</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>, </span></span><span>int</span><span><span> </span><span>a</span><span>, </span></span><span>int</span><span><span> </span><span>b</span><span>, </span></span><span>int</span><span><span> </span><span>c</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span><span> a </span><span>*</span><span> num </span><span>*</span><span> num </span><span>+</span><span> b </span><span>*</span><span> num </span><span>+</span><span> c;</span></span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>sortTransformedArray</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>a</span><span>, </span></span><span>int</span><span><span> </span><span>b</span><span>, </span></span><span>int</span><span><span> </span><span>c</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[] {};</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[len];</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>// index of result array</span></div></div><div><div><div>15</div></div><div><span>        </span><span>// a &gt;= 0, then start from maximum value, otherwise start from minimum</span></div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> a </span><span>&gt;=</span><span> </span></span><span>0</span><span> </span><span>?</span><span><span> len </span><span>-</span><span> </span></span><span>1</span><span> </span><span>:</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, j </span><span>=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;=</span><span> j) {</span></span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span><span> (a </span><span>&gt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>result[index] </span><span>=</span><span> </span><span>quad</span><span><span>(nums[i], a, b, c) </span><span>&gt;=</span><span> </span></span><span>quad</span><span>(nums[j], a, b, c) </span><span>?</span><span> </span><span>quad</span><span>(nums[i++], a, b, c) </span><span>:</span><span> </span><span>quad</span><span>(nums[j--], a, b, c);</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>index--;</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>result[index] </span><span>=</span><span> </span><span>quad</span><span><span>(nums[i], a, b, c) </span><span>&gt;=</span><span> </span></span><span>quad</span><span>(nums[j], a, b, c) </span><span>?</span><span> </span><span>quad</span><span>(nums[j--], a, b, c) </span><span>:</span><span> </span><span>quad</span><span>(nums[i++], a, b, c);</span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>index++;</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>361. Bomb Enemy<a href="#361-bomb-enemy"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/bomb-enemy/" target="_blank">https://leetcode.com/problems/bomb-enemy/</a></p><hr /><p>常规思路，二重循环直接遍历记数，但注意到每一行杀死的敌人数只需要用一个变量存起来就行了，节省空间。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxKilledEnemies</span><span>(</span><span>char</span><span><span>[][] </span><span>grid</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (grid </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>grid</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> grid[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>grid</span><span>.</span><span>length</span><span><span>, n </span><span>=</span><span> grid[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>rowhits</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// no need to store with array, since the result is updated after going through a row</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>colhits</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> m; i++) {</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> n; j++) {</span></span></div></div><div><div><div>14</div></div><div><span>                </span><span>// current row</span></div></div><div><div><div>15</div></div><div><span>                </span><span>if</span><span><span> (j </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> grid[i][j </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>==</span><span> </span></span><span>'W'</span><span>) {</span></div></div><div><div><div>16</div></div><div><span><span>                    </span></span><span>rowhits </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div><span>                    </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> j; k </span><span>&lt;</span><span> n </span><span>&amp;&amp;</span><span> grid[i][k] </span><span>!=</span><span> </span></span><span>'W'</span><span>; k++) {</span></div></div><div><div><div>18</div></div><div><span><span>                        </span></span><span>rowhits </span><span>+=</span><span> grid[i][k] </span><span>==</span><span> </span><span>'E'</span><span> </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>                </span><span>// current column</span></div></div><div><div><div>23</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> grid[i </span><span>-</span><span> </span></span><span>1</span><span><span>][j] </span><span>==</span><span> </span></span><span>'W'</span><span>) {</span></div></div><div><div><div>24</div></div><div><span><span>                    </span></span><span>colhits[j] </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>25</div></div><div><span>                    </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> i; k </span><span>&lt;</span><span> m </span><span>&amp;&amp;</span><span> grid[k][j] </span><span>!=</span><span> </span></span><span>'W'</span><span>; k++) {</span></div></div><div><div><div>26</div></div><div><span><span>                        </span></span><span>colhits[j] </span><span>+=</span><span> grid[k][j] </span><span>==</span><span> </span><span>'E'</span><span> </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>                </span><span>if</span><span><span> (grid[i][j] </span><span>==</span><span> </span></span><span>'0'</span><span>) {</span></div></div><div><div><div>31</div></div><div><span><span>                    </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, rowhits </span><span>+</span><span> colhits[j]);</span></span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>362. Design Hit Counter<a href="#362-design-hit-counter"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/design-hit-counter/" target="_blank">https://leetcode.com/problems/design-hit-counter/</a></p><hr /><p>使用两个长度为300的数组，分别对应时间戳和点击量，每个时间戳和点击量都是根据数组下标一一对应的，每当有新点击时，将时间戳与300取模，这一步能方便的判断这个新时间是否需要将旧时间覆盖。如果覆盖，计数重置，反之计数增加1。获取点击量时，直接遍历数组，根据时间戳累加最近5分钟内的结果即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>HitCounter</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] times</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] hits</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>7</div></div><div><span>    </span><span>public</span><span> </span><span>HitCounter</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>times </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span>[</span><span>300</span><span>];</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>hits </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span>[</span><span>300</span><span>];</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>/** Record a hit.</span></div></div><div><div><div>13</div></div><div><span>            </span><span>@param</span><span> </span><span>timestamp</span><span> - The current timestamp (in seconds granularity). */</span></div></div><div><div><div>14</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>hit</span><span>(</span><span>int</span><span><span> </span><span>timestamp</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>15</div></div><div><span>        </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> timestamp </span><span>%</span><span> </span></span><span>300</span><span>;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// a new timestamp overrides an old timestamp more than 5 minutes ago</span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (times[index] </span><span>!=</span><span> timestamp) {</span></span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>times[index] </span><span>=</span><span> timestamp;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>hits[index] </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>hits[index]++;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>/** Return the number of hits in the past 5 minutes.</span></div></div><div><div><div>27</div></div><div><span>            </span><span>@param</span><span> </span><span>timestamp</span><span> - The current timestamp (in seconds granularity). */</span></div></div><div><div><div>28</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>getHits</span><span>(</span><span>int</span><span><span> </span><span>timestamp</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>29</div></div><div><span>        </span><span>int</span><span><span> </span><span>total</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>300</span><span>; i++)  {</span></div></div><div><div><div>32</div></div><div><span>            </span><span>// only add timestamp in the past 5 minutes</span></div></div><div><div><div>33</div></div><div><span>            </span><span>if</span><span><span> (timestamp </span><span>-</span><span> times[i] </span><span>&lt;</span><span> </span></span><span>300</span><span>) {</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>total </span><span>+=</span><span> hits[i];</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> total;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>363. Max Sum of Rectangle No Larger Than K<a href="#363-max-sum-of-rectangle-no-larger-than-k"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/" target="_blank">https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/</a></p><hr /><p>先在水平方向遍历循环决定矩形的长度，把每一行的和整理到一个一维数组中，再从竖直方向遍历循环决定矩形的宽度，并根据这个宽度在一维数组上进行求和，得到最大的矩形。针对本题的test case，可以先不在竖直方向进行循环，直接尝试最大和，有助于提升运行效率。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxSumSubmatrix</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>rows</span><span> </span></span><span><span>=</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span>, cols </span><span>=</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> cols; j++) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>int</span><span><span>[] </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[rows];</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>            </span><span>// try every possible matrix length</span></div></div><div><div><div>10</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> j; c </span><span>&lt;</span><span> cols; c++) {</span></span></div></div><div><div><div>11</div></div><div><span>                </span><span>// get horizontal sum</span></div></div><div><div><div>12</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>r</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; r </span><span>&lt;</span><span> rows; r++) {</span></span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>sum[r] </span><span>+=</span><span> matrix[r][c];</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>                </span><span>// for current length, get maximum vertical sum first, which greatly reduces runtime</span></div></div><div><div><div>17</div></div><div><span>                </span><span>int</span><span><span> </span><span>max</span><span> </span></span><span><span>=</span><span> sum[</span></span><span>0</span><span>];</span></div></div><div><div><div>18</div></div><div><span>                </span><span>int</span><span><span> </span><span>maxSoFar</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>19</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>s</span><span> </span></span><span>:</span><span> sum) {</span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>maxSoFar </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(maxSoFar </span><span>+</span><span> s, s);</span></span></div></div><div><div><div>21</div></div><div><span><span>                    </span></span><span>max </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(max, maxSoFar);</span></div></div><div><div><div>22</div></div><div><span>                    </span><span>if</span><span><span> (max </span><span>==</span><span> k) {</span></span></div></div><div><div><div>23</div></div><div><span>                        </span><span>return</span><span> k;</span></div></div><div><div><div>24</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>                </span><span>if</span><span><span> (max </span><span>&lt;</span><span> k) {</span></span></div></div><div><div><div>28</div></div><div><span><span>                    </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, max);</span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>30</div></div><div><span>                    </span><span>// too large, should exclude some rows</span></div></div><div><div><div>31</div></div><div><span>                    </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>r</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; r </span><span>&lt;</span><span> rows; r++) {</span></span></div></div><div><div><div>32</div></div><div><span>                        </span><span>int</span><span><span> </span><span>curSum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>33</div></div><div><span>                        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> r; i </span><span>&lt;</span><span> rows; i++) {</span></span></div></div><div><div><div>34</div></div><div><span><span>                            </span></span><span>curSum </span><span>+=</span><span> sum[i];</span></div></div><div><div><div>35</div></div><div><span>                            </span><span>if</span><span><span> (curSum </span><span>&lt;=</span><span> k) {</span></span></div></div><div><div><div>36</div></div><div><span><span>                                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, curSum);</span></div></div><div><div><div>37</div></div><div><span><span>                            </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>                    </span><span>if</span><span><span> (result </span><span>==</span><span> k) {</span></span></div></div><div><div><div>42</div></div><div><span>                        </span><span>return</span><span> k;</span></div></div><div><div><div>43</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>49</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>364. Nested List Weight Sum II<a href="#364-nested-list-weight-sum-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/nested-list-weight-sum-ii/" target="_blank">https://leetcode.com/problems/nested-list-weight-sum-ii/</a></p><hr /><p>逐层处理，对于当前一层的对象，如果是数字就进行累加，否则就丢到下一层的List中。每处理完一层，将累加的结果更新到结果中。注意每一层的累加不清空，因为高层的数需要被重复累加，才能得到正确的权值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* // This is the interface that allows for creating nested lists.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* // You should not implement it, or speculate about its implementation</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>* public interface NestedInteger {</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     // Constructor initializes an empty nested list.</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     public NestedInteger();</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     // Constructor initializes a single integer.</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     public NestedInteger(int value);</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*     // </span><span>@return</span><span> true if this NestedInteger holds a single integer, rather than a nested list.</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*     public boolean isInteger();</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>*     // </span><span>@return</span><span> the single integer that this NestedInteger holds, if it holds a single integer</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*     // Return null if this NestedInteger holds a nested list</span></div></div><div><div><div>16</div></div><div><span><span> </span></span><span>*     public Integer getInteger();</span></div></div><div><div><div>17</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>18</div></div><div><span><span> </span></span><span>*     // Set this NestedInteger to hold a single integer.</span></div></div><div><div><div>19</div></div><div><span><span> </span></span><span>*     public void setInteger(int value);</span></div></div><div><div><div>20</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>21</div></div><div><span><span> </span></span><span>*     // Set this NestedInteger to hold a nested list and adds a nested integer to it.</span></div></div><div><div><div>22</div></div><div><span><span> </span></span><span>*     public void add(NestedInteger ni);</span></div></div><div><div><div>23</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>24</div></div><div><span><span> </span></span><span>*     // </span><span>@return</span><span> the nested list that this NestedInteger holds, if it holds a nested list</span></div></div><div><div><div>25</div></div><div><span><span> </span></span><span>*     // Return empty list if this NestedInteger holds a single integer</span></div></div><div><div><div>26</div></div><div><span><span> </span></span><span>*     public List&lt;NestedInteger&gt; getList();</span></div></div><div><div><div>27</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>28</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>29</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>30</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>depthSumInverse</span><span>(</span><span>List</span><span>&lt;</span><span>NestedInteger</span><span><span>&gt; </span><span>nestedList</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>unweighted</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, result </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>nestedList</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>34</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>NestedInteger</span><span><span>&gt; </span><span>nextLevel</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>            </span><span>// simply add all integers in this level, or leave lists to next level</span></div></div><div><div><div>37</div></div><div><span>            </span><span>for</span><span> (</span><span>NestedInteger</span><span><span> </span><span>ni</span><span> </span></span><span>:</span><span> nestedList) {</span></div></div><div><div><div>38</div></div><div><span>                </span><span>// former unweighted integers are not reset</span></div></div><div><div><div>39</div></div><div><span>                </span><span>if</span><span> (</span><span>ni</span><span>.</span><span>isInteger</span><span>()) {</span></div></div><div><div><div>40</div></div><div><span><span>                    </span></span><span>unweighted </span><span>+=</span><span> </span><span>ni</span><span>.</span><span>getInteger</span><span>();</span></div></div><div><div><div>41</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>42</div></div><div><span>                    </span><span>nextLevel</span><span>.</span><span>addAll</span><span>(</span><span>ni</span><span>.</span><span>getList</span><span>());</span></div></div><div><div><div>43</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>            </span><span>// after dealing with each level, summarize to result</span></div></div><div><div><div>47</div></div><div><span>            </span><span>// depth is implemented with multiple adding in each level</span></div></div><div><div><div>48</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> unweighted;</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>nestedList </span><span>=</span><span> nextLevel;</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>53</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>365. Water and Jug Problem<a href="#365-water-and-jug-problem"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/water-and-jug-problem/" target="_blank">https://leetcode.com/problems/water-and-jug-problem/</a></p><hr /><p>解题需要使用Bezout定理：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Let a and b be nonzero integers and let d be their greatest common divisor. Then there exist integers x and y such that ax + by = d.</span></div></div><div><div><div>2</div></div><div><span>In addition, the greatest common divisor of x and y, d, is the smallest positive integer that can be written as ax + by.</span></div></div><div><div><div>3</div></div><div><span>Every integer of the form ax + by is a multiple of the greatest common divisor d.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>我们需要校验<code>z</code>是否是<code>x</code>, <code>y</code>公约数的倍数，因为如果是的话，就一定有符合的整数<code>a</code>, <code>b</code>使得<code>ax + by = d</code>。</p><p>在此题中，整数<code>a</code>, <code>b</code>代表着<code>x</code>, <code>y</code>倒水或者装水的次数。如果<code>a</code>或<code>b</code>是负数，代表从<code>x</code>或<code>y</code>中倒水；反之如果<code>a</code>或<code>b</code>是正数，代表给<code>x</code>或者<code>y</code>装满水。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>canMeasureWater</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>, </span></span><span>int</span><span><span> </span><span>z</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// cannot exceed two jugs' capacities</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (x </span><span>+</span><span> y </span><span>&lt;</span><span> z) {</span></span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// judge if we can achieve by using one jug, or two jugs simple combination</span></div></div><div><div><div>9</div></div><div><span>        </span><span>if</span><span><span> (x </span><span>==</span><span> z </span><span>||</span><span> y </span><span>==</span><span> z </span><span>||</span><span> x </span><span>+</span><span> y </span><span>==</span><span> z) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// get GCD, then we can use the property of Bézout's identity</span></div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span><span> z </span><span>%</span><span> </span></span><span>GCD</span><span><span>(x, y) </span><span>==</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>GCD</span><span>(</span><span>int</span><span><span> </span><span>a</span><span>, </span></span><span>int</span><span><span> </span><span>b</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>while</span><span><span> (b </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> b;</span></span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>b </span><span>=</span><span> a </span><span>%</span><span> b;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>a </span><span>=</span><span> temp;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> a;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>366. Find Leaves of Binary Tree<a href="#366-find-leaves-of-binary-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-leaves-of-binary-tree/" target="_blank">https://leetcode.com/problems/find-leaves-of-binary-tree/</a></p><hr /><p>计算每个节点到根的深度，将相同深度的节点归类到一个List中，遍历时直接按照深度添加到对应的List中即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>findLeaves</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>height</span><span>(root, result);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>height</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>, </span></span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>// get height from current node to deepest leaf</span></div></div><div><div><div>29</div></div><div><span>        </span><span>int</span><span><span> </span><span>level</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span> </span><span>+</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(</span><span>height</span><span>(</span><span>node</span><span>.</span><span>left</span><span>, result), </span><span>height</span><span>(</span><span>node</span><span>.</span><span>right</span><span>, result));</span></div></div><div><div><div>30</div></div><div><span>        </span><span>if</span><span> (</span><span>result</span><span>.</span><span>size</span><span><span>() </span><span>==</span><span> level) {</span></span></div></div><div><div><div>31</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;());</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>result</span><span>.</span><span>get</span><span>(level).</span><span>add</span><span>(</span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>35</div></div><div><span>        </span><span>return</span><span> level;</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>367. Valid Perfect Square<a href="#367-valid-perfect-square"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/valid-perfect-square/" target="_blank">https://leetcode.com/problems/valid-perfect-square/</a></p><hr /><p>引用牛顿求平方根的公式。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isPerfectSquare</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>long</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> num;</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>while</span><span><span> (x </span><span>*</span><span> x </span><span>&gt;</span><span> num) {</span></span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>x </span><span>=</span><span> (x </span><span>+</span><span> num </span><span>/</span><span> x) </span><span>/</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>        </span><span>return</span><span><span> x </span><span>*</span><span> x </span><span>==</span><span> num;</span></span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>368. Largest Divisible Subset<a href="#368-largest-divisible-subset"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/largest-divisible-subset/" target="_blank">https://leetcode.com/problems/largest-divisible-subset/</a></p><hr /><ol>
<li>对数组中每个元素，先找出其拥有的最大子集的长度</li>
<li>得到最长子集长度<code>maxIndex</code></li>
<li>将<code>nums[Index]</code>至0范围内，属于最大子集的数添加到结果</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>static</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>largestDivisibleSubset</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(nums);</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>nums</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>11</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span>(dp ,</span><span>1</span><span>);</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>// for each element in nums, find the length of largest subset it has.</span></div></div><div><div><div>15</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i</span><span>-</span></span><span>1</span><span><span>; j </span><span>&gt;=</span><span> </span></span><span>0</span><span>; j--) {</span></div></div><div><div><div>17</div></div><div><span>                </span><span>if</span><span><span> (nums[i] </span><span>%</span><span> nums[j] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>18</div></div><div><span><span>                    </span></span><span>dp[i] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(dp[i], dp[j] </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>// pick the index of the largest element in dp.</span></div></div><div><div><div>24</div></div><div><span>        </span><span>int</span><span><span> </span><span>maxIndex</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>25</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>maxIndex </span><span>=</span><span> dp[i] </span><span>&gt;</span><span> dp[maxIndex] </span><span>?</span><span> i </span><span>:</span><span> maxIndex;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// from nums[maxIndex] to 0, add every element belongs to the largest subset.</span></div></div><div><div><div>30</div></div><div><span>        </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> nums[maxIndex];</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>curDp</span><span> </span></span><span><span>=</span><span> dp[maxIndex];</span></span></div></div><div><div><div>32</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> maxIndex; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>33</div></div><div><span>            </span><span>if</span><span><span> (temp </span><span>%</span><span> nums[i] </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> dp[i] </span><span>==</span><span> curDp) {</span></span></div></div><div><div><div>34</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(nums[i]);</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>temp </span><span>=</span><span> nums[i];</span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>curDp--;</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>369. Plus One Linked List<a href="#369-plus-one-linked-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/plus-one-linked-list/" target="_blank">https://leetcode.com/problems/plus-one-linked-list/</a></p><hr /><p>使用DFS求进位，即先算完当前位后面的位产生的进位，再计算当前位的进位，同时修改当前位的值。如果到最高位进位不是0，还需要补上一个’1’。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>plusOne</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span> (</span><span>dfs</span><span><span>(head) </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> head;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>// need to add '1' in the leftmost place</span></div></div><div><div><div>17</div></div><div><span>            </span><span>ListNode</span><span><span> </span><span>newHead</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>1</span><span>);</span></div></div><div><div><div>18</div></div><div><span>            </span><span>newHead</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> head;</span></span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> newHead;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>// use dfs to get carry</span></div></div><div><div><div>24</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>dfs</span><span>(</span><span>ListNode</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// get carry after current node</span></div></div><div><div><div>30</div></div><div><span>        </span><span>int</span><span><span> </span><span>carry</span><span> </span></span><span><span>=</span><span> </span></span><span>dfs</span><span>(</span><span>node</span><span>.</span><span>next</span><span>);</span></div></div><div><div><div>31</div></div><div><span>        </span><span>if</span><span><span> (carry </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>32</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>// current node's calculation</span></div></div><div><div><div>36</div></div><div><span>        </span><span>int</span><span><span> </span><span>val</span><span> </span></span><span><span>=</span><span> </span></span><span>node</span><span>.</span><span>val</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>37</div></div><div><span>        </span><span>node</span><span>.</span><span>val</span><span><span> </span><span>=</span><span> val </span><span>%</span><span> </span></span><span>10</span><span>;</span></div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span><span> val </span><span>/</span><span> </span></span><span>10</span><span>; </span><span>// carry</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>370. Range Addition<a href="#370-range-addition"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/range-addition/" target="_blank">https://leetcode.com/problems/range-addition/</a></p><hr /><p>使用一个数组<code>temp</code>进行区间累加得到结果。对于每一次update，都让<code>temp[start] += value</code>，表示从<code>start</code>起，之后的累加中每个数都会多增加<code>value</code>，并且再让<code>temp[end + 1] -= value</code>，表示从<code>end + 1</code>起，之后的累加中每个数都会减少<code>value</code>。需要注意如果<code>end</code>已经是数组的最后一个数时，不需要更新<code>temp</code>数组，因为不存在影响后续累加的问题了。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>getModifiedArray</span><span>(</span><span>int</span><span><span> </span><span>length</span><span>, </span></span><span>int</span><span><span>[][] </span><span>updates</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>temp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[length];</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[length];</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>update</span><span> </span></span><span>:</span><span> updates) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>int</span><span><span> </span><span>start</span><span> </span></span><span><span>=</span><span> update[</span></span><span>0</span><span>];</span></div></div><div><div><div>8</div></div><div><span>            </span><span>int</span><span><span> </span><span>end</span><span> </span></span><span><span>=</span><span> update[</span></span><span>1</span><span>];</span></div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span><span> </span><span>value</span><span> </span></span><span><span>=</span><span> update[</span></span><span>2</span><span>];</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>            </span><span>// from this position and on, all subsequent sum will each increase by value</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>temp[start] </span><span>+=</span><span> value;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>            </span><span>// from this position and on, all subsequent sum will each decrease by value</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span><span> (end </span><span>&lt;</span><span> length </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>temp[end </span><span>+</span><span> </span><span>1</span><span><span>] </span><span>-=</span><span> value;</span></span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>21</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> length; i++) {</span></span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>sum </span><span>+=</span><span> temp[i];</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>result[i] </span><span>=</span><span> sum;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>371. Sum of Two Integers<a href="#371-sum-of-two-integers"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sum-of-two-integers/" target="_blank">https://leetcode.com/problems/sum-of-two-integers/</a></p><hr /><p>解题流程共3步：</p><ul>
<li>提前找到所有会发生进位的位置</li>
<li>用异或模拟二进制加</li>
<li>将所有进位向左移动一位，到达正确的位置</li>
</ul><p>持续上述过程，一直到进位为0没有进位为止。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>getSum</span><span>(</span><span>int</span><span><span> </span><span>a</span><span>, </span></span><span>int</span><span><span> </span><span>b</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>carry</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>while</span><span><span> (b </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>// find the carry</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>carry </span><span>=</span><span> a </span><span>&amp;</span><span> b;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>            </span><span>// perform basic add operarion</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>a </span><span>=</span><span> a </span><span>^</span><span> b;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>            </span><span>// shift the carry to the right position</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>b </span><span>=</span><span> (carry) </span><span>&lt;&lt;</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> a;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>372. Super Pow<a href="#372-super-pow"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/super-pow/" target="_blank">https://leetcode.com/problems/super-pow/</a></p><hr /><p>利用a<sup>x+y</sup> = a<sup>x</sup> · a<sup>y</sup>的性质，逐位计算次幂。次幂函数可以使用递归，不断降次来突破位数限制。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>superPow</span><span>(</span><span>int</span><span><span> </span><span>a</span><span>, </span></span><span>int</span><span><span>[] </span><span>b</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span>:</span><span> b) {</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>pow</span><span>(result, </span><span>10</span><span><span>) </span><span>*</span><span> </span></span><span>pow</span><span><span>(a, i) </span><span>%</span><span> </span></span><span>1337</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>pow</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>11</div></div><div><span>        </span><span>if</span><span><span> (y </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>return</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (y </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>return</span><span><span> x </span><span>%</span><span> </span></span><span>1337</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> </span><span>pow</span><span><span>(x </span><span>%</span><span> </span></span><span>1337</span><span><span>, y </span><span>/</span><span> </span></span><span>2</span><span><span>) </span><span>*</span><span> </span></span><span>pow</span><span><span>(x </span><span>%</span><span> </span></span><span>1337</span><span><span>, y </span><span>-</span><span> y </span><span>/</span><span> </span></span><span>2</span><span><span>) </span><span>%</span><span> </span></span><span>1337</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>373. Find K Pairs with Smallest Sums<a href="#373-find-k-pairs-with-smallest-sums"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-k-pairs-with-smallest-sums/" target="_blank">https://leetcode.com/problems/find-k-pairs-with-smallest-sums/</a></p><hr /><p>由于两个数组都是固定的，因此可以采用固定一个数组<code>nums1</code>，循环遍历另一个数组<code>nums2</code>的策略，穷举每一个数对。使用一个优先队列<code>pq</code>记录两个数在各自数组中的下标，已经他们的和，根据和的大小来规定优先队列的排序规则。如果已经添加的数对不足<code>k</code>个，就把当前数对添加进去，并且如果<code>nums2</code>尚未遍历结束，就将<code>nums2</code>中的下一个数提取出来，和目前<code>nums1</code>中的数组成新数对，添加到优先队列中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>kSmallestPairs</span><span>(</span><span>int</span><span><span>[] </span><span>nums1</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums2</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// index1, index2, sum</span></div></div><div><div><div>6</div></div><div><span>        </span><span>PriorityQueue</span><span>&lt;</span><span>int</span><span><span>[]&gt; </span><span>pq</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;&gt;((a, b) </span><span>-&gt;</span><span> a[</span><span>2</span><span><span>] </span><span>-</span><span> b[</span></span><span>2</span><span>]);</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span>(k, </span><span>nums1</span><span>.</span><span>length</span><span>); i++) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>pq</span><span>.</span><span>offer</span><span>(</span><span>new</span><span> </span><span>int</span><span>[]{i, </span><span>0</span><span><span>, nums1[i] </span><span>+</span><span> nums2[</span></span><span>0</span><span>]});</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>pq</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>k--;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>            </span><span>int</span><span><span>[] </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>pq</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>15</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>List</span><span>.</span><span>of</span><span>(nums1[cur[</span><span>0</span><span>]], nums2[cur[</span><span>1</span><span>]]));</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span><span> (k </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>18</div></div><div><span>                </span><span>return</span><span> result;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span> (cur[</span><span>1</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>&lt;</span><span> </span></span><span>nums2</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>                </span><span>pq</span><span>.</span><span>offer</span><span>(</span><span>new</span><span> </span><span>int</span><span>[]{cur[</span><span>0</span><span>], cur[</span><span>1</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span>, nums1[cur[</span><span>0</span><span><span>]] </span><span>+</span><span> nums2[cur[</span></span><span>1</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span>]});</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>374. Guess Number Higher or Lower<a href="#374-guess-number-higher-or-lower"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/guess-number-higher-or-lower/" target="_blank">https://leetcode.com/problems/guess-number-higher-or-lower/</a></p><hr /><p>题干关于guess API的描述，几乎是直接对应了二分查找模版1的三种情形，可以是说天造地设。需要注意，此题的设定使得一定能找到pick的数，换言之代码一定能在while循环中返回到最终结果，所以while循环之后的后续处理中（找不到<code>target</code>数的情况），随便return任意数都无所谓。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Forward declaration of guess API.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* </span><span>@param</span><span>  </span><span>num</span><span>   your guess</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>* </span><span>@return</span><span>        -1 if num is higher than the picked number</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*            1 if num is lower than the picked number</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*               otherwise return 0</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>* int guess(int num);</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>extends</span><span><span> </span><span>GuessGame</span><span> </span></span><span>{</span></div></div><div><div><div>11</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>guessNumber</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>, right </span><span>=</span><span> n;</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;=</span><span> right) {</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span> (</span><span>guess</span><span><span>(mid) </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>                </span><span>return</span><span> mid;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>guess</span><span><span>(mid) </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>375. Guess Number Higher or Lower II<a href="#375-guess-number-higher-or-lower-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/guess-number-higher-or-lower-ii/" target="_blank">https://leetcode.com/problems/guess-number-higher-or-lower-ii/</a></p><hr /><p>Min-Max问题，对于一个范围<code>[l, h]</code>，如果要猜其中一个数<code>i</code>并且错了，所需要的最小成本就是<code>i + max([l, i-1], [i+1, h])</code>，因为这两段的选择是任意的。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>getMoneyAmount</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[n </span><span>+</span><span> </span></span><span>1</span><span><span>][n </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>4</div></div><div><span>        </span><span>return</span><span> </span><span>minCost</span><span>(dp, </span><span>1</span><span>, n);</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>minCost</span><span>(</span><span>int</span><span><span>[][] </span><span>dp</span><span>, </span></span><span>int</span><span><span> </span><span>l</span><span>, </span></span><span>int</span><span><span> </span><span>h</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>if</span><span><span> (l </span><span>&gt;=</span><span> h) {</span></span></div></div><div><div><div>9</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span>        </span><span>if</span><span><span> (l </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>==</span><span> h) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>return</span><span> l;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (dp[l][h] </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>return</span><span> dp[l][h];</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span> </span><span>minCost</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>19</div></div><div><span>        </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> l </span><span>+</span><span> (h </span><span>-</span><span> l) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> h </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> mid; i </span><span>-=</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>minCost </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(minCost, i </span><span>+</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(</span><span>minCost</span><span><span>(dp, l, i </span><span>-</span><span> </span></span><span>1</span><span>), </span><span>minCost</span><span><span>(dp, i </span><span>+</span><span> </span></span><span>1</span><span>, h)));</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>dp[l][h] </span><span>=</span><span> minCost;</span></div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> minCost;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>376. Wiggle Subsequence<a href="#376-wiggle-subsequence"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/wiggle-subsequence/" target="_blank">https://leetcode.com/problems/wiggle-subsequence/</a></p><hr /><p>使用贪心算法。循环遍历数组，使用两个变量<code>up</code>和<code>down</code>分别表示当前数如果作为最后一个符合条件的上升数或下降数，wiggle sequence相应的长度是多少。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>wiggleMaxLength</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>up</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>, down </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>if</span><span><span> (nums[i] </span><span>&lt;</span><span> nums[i </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>down </span><span>=</span><span> up </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (nums[i] </span><span>&gt;</span><span> nums[i </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>up </span><span>=</span><span> down </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(up, down);</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>377. Combination Sum IV<a href="#377-combination-sum-iv"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/combination-sum-iv/" target="_blank">https://leetcode.com/problems/combination-sum-iv/</a></p><hr /><p>使用动态规划，从0开始递推到<code>target</code>。遍历数组时，对于每一个数，如果这个数比<code>target</code>小，就递归计算以<code>target - nums[i]</code>为目标，有多少种组合方式。每完成一个数的计算，就将结果更新到动态规划数组中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] dp</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>combinationSum4</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>dp </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span><span>[target </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>6</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span><span>(dp, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>return</span><span> </span><span>helper</span><span>(nums, target);</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>helper</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>if</span><span><span> (dp[target] </span><span>!=</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>return</span><span> dp[target];</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>if</span><span><span> (target </span><span>&gt;=</span><span> nums[i]) {</span></span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> </span><span>helper</span><span><span>(nums, target </span><span>-</span><span> nums[i]);</span></span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>dp[target] </span><span>=</span><span> result;</span></div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>378. Kth Smallest Element in a Sorted Matrix<a href="#378-kth-smallest-element-in-a-sorted-matrix"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/" target="_blank">https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/</a></p><hr /><p>使用范围二分搜索，初始范围是二维数组的第一个数（最小）到最后一个数（最大）。每次算出中至<code>mid</code>后，遍历每一行检查一共有多少个数小于等于k。如果发现这个数量小于k，说明目前的<code>mid</code>选的太小了，因此下一次的搜索范围就要从<code>mid+1</code>开始；反之亦然。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>kthSmallest</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (matrix </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>low</span><span> </span></span><span><span>=</span><span> matrix[</span></span><span>0</span><span>][</span><span>0</span><span><span>], high </span><span>=</span><span> matrix[</span></span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>][matrix[</span><span>0</span><span>].</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>while</span><span><span> (low </span><span>&lt;</span><span> high) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> low </span><span>+</span><span> (high </span><span>-</span><span> low) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>11</div></div><div><span>            </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, j </span><span>=</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>14</div></div><div><span>                </span><span>// find how many numbers are smaller than or equal to mid</span></div></div><div><div><div>15</div></div><div><span>                </span><span>while</span><span><span> (j </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> matrix[i][j] </span><span>&gt;</span><span> mid) {</span></span></div></div><div><div><div>16</div></div><div><span><span>                    </span></span><span>j--;</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>count </span><span>+=</span><span> (j </span><span>+</span><span> </span><span>1</span><span>);</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>if</span><span><span> (count </span><span>&lt;</span><span> k) {</span></span></div></div><div><div><div>22</div></div><div><span>                </span><span>// mid is smaller than k</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>low </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>25</div></div><div><span>                </span><span>// mid is larger than k</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>high </span><span>=</span><span> mid;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span> low;</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>379. Design Phone Directory<a href="#379-design-phone-directory"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/design-phone-directory/" target="_blank">https://leetcode.com/problems/design-phone-directory/</a></p><hr /><p>使用一个HashSet存储所有已经分配出去的号码，再使用一个queue存储所有可用的号码。</p><ul>
<li>初始化：将号码段内所有号码放进queue</li>
<li>get：如果可用号码队列不空，选队首的号码分配，同时将其放入HashSet</li>
<li>check：检查这个号码是否在HashSet中</li>
<li>release：将这个号码从HashSet中删除，并且重新放回queue末尾</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>PhoneDirectory</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>// store the assigned phone number</span></div></div><div><div><div>4</div></div><div><span>    </span><span>HashSet</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> AssignedSet</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>Queue</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> q </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayDeque</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here</span></div></div><div><div><div>8</div></div><div><span>            </span><span>@param</span><span> </span><span>maxNumbers</span><span> - The maximum numbers that can be stored in the phone directory. */</span></div></div><div><div><div>9</div></div><div><span>    </span><span>public</span><span> </span><span>PhoneDirectory</span><span>(</span><span>int</span><span><span> </span><span>maxNumbers</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>AssignedSet </span><span>=</span><span> </span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> maxNumbers; i++) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>q</span><span>.</span><span>offer</span><span>(i);</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>/** Provide a number which is not assigned to anyone.</span></div></div><div><div><div>17</div></div><div><span>            </span><span>@return</span><span> - Return an available number. Return -1 if none is available. */</span></div></div><div><div><div>18</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>get</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>if</span><span> (</span><span>q</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>20</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>int</span><span><span> </span><span>number</span><span> </span></span><span><span>=</span><span> </span></span><span>q</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>24</div></div><div><span>        </span><span>AssignedSet</span><span>.</span><span>add</span><span>(number);</span></div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> number;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>/** Check if a number is available or not. */</span></div></div><div><div><div>29</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>check</span><span>(</span><span>int</span><span><span> </span><span>number</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span><span> </span><span>!</span></span><span>AssignedSet</span><span>.</span><span>contains</span><span>(number);</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>/** Recycle or release a number. */</span></div></div><div><div><div>34</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>release</span><span>(</span><span>int</span><span><span> </span><span>number</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>35</div></div><div><span>        </span><span>if</span><span> (</span><span>AssignedSet</span><span>.</span><span>contains</span><span>(number)) {</span></div></div><div><div><div>36</div></div><div><span>            </span><span>AssignedSet</span><span>.</span><span>remove</span><span>(number);</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>            </span><span>// add back to available queue</span></div></div><div><div><div>39</div></div><div><span>            </span><span>q</span><span>.</span><span>offer</span><span>(number);</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>380. Insert Delete GetRandom O(1)<a href="#380-insert-delete-getrandom-o1"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/insert-delete-getrandom-o1/" target="_blank">https://leetcode.com/problems/insert-delete-getrandom-o1/</a></p><hr /><p>使用一个list用于存储set中的每一个数，再用一个map记录每个数对应的下标。</p><ul>
<li>添加元素，需要确保这个元素不在map中，再将这个数添加到list结尾，更新map</li>
<li>删除元素，实际上是将list中原先的最后一个数“移动”到现在被删除的位置上，具体就是更新这个数在map中的下标，拷贝值覆盖list这个位置的值，再将list中的最后一个值删除</li>
<li>获取随机元素，根据list的长度生成随机下标访问list</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>RandomizedSet</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> list</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>Integer</span><span><span>,</span><span> </span></span><span>Integer</span><span><span>&gt;</span><span> map</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>Random</span><span> rand</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>    </span><span>public</span><span> </span><span>RandomizedSet</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>this</span><span>.</span><span>list</span><span><span> </span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>9</div></div><div><span>        </span><span>this</span><span>.</span><span>map</span><span><span> </span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>10</div></div><div><span>        </span><span>this</span><span>.</span><span>rand</span><span><span> </span><span>=</span><span> </span></span><span>new</span><span> </span><span>Random</span><span>();</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */</span></div></div><div><div><div>14</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>insert</span><span>(</span><span>int</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>15</div></div><div><span>        </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span>(val)) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>list</span><span>.</span><span>add</span><span>(val);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(val, </span><span>list</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>/** Removes a value from the set. Returns true if the set contained the specified element. */</span></div></div><div><div><div>25</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>remove</span><span>(</span><span>int</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>map</span><span>.</span><span>containsKey</span><span>(val)) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>get</span><span>(val);</span></div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>preTailVal</span><span> </span></span><span><span>=</span><span> </span></span><span>list</span><span>.</span><span>get</span><span>(</span><span>list</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>// move the pre-tail element to current val position</span></div></div><div><div><div>34</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(preTailVal, index); </span><span>// update pre-tail's index</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>list</span><span>.</span><span>set</span><span>(index, preTailVal); </span><span>// copy pre-tail's value</span></div></div><div><div><div>37</div></div><div><span>        </span><span>list</span><span>.</span><span>remove</span><span>(</span><span>list</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>); </span><span>// delete pre-tail</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>// remove in map</span></div></div><div><div><div>40</div></div><div><span>        </span><span>map</span><span>.</span><span>remove</span><span>(val);</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>/** Get a random element from the set. */</span></div></div><div><div><div>46</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>getRandom</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>47</div></div><div><span>        </span><span>return</span><span> </span><span>list</span><span>.</span><span>get</span><span>(</span><span>rand</span><span>.</span><span>nextInt</span><span>(</span><span>list</span><span>.</span><span>size</span><span>()));</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>381. Insert Delete GetRandom O(1) - Duplicates allowed<a href="#381-insert-delete-getrandom-o1---duplicates-allowed"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/insert-delete-getrandom-o1-duplicates-allowed/" target="_blank">https://leetcode.com/problems/insert-delete-getrandom-o1-duplicates-allowed/</a></p><hr /><p>因为有duplication存在，因此同一个元素可能在list中出现多次，map不能再使用<code>&lt;Integer, Integer&gt;</code>的格式，value部分也应该使用一个list存储全部的下标。</p><ul>
<li>添加元素，根据这个元素是否在map中决定是否需要创建一个新的<code>indexList</code>，并将新添加的元素加入到<code>indexList</code>尾部</li>
<li>删除元素，总是删除其对应<code>indexList</code>里的第一个元素，即从第一次出现的位置开始，把list中的元素改成null，再修改<code>indexList</code>。需要注意当最后一个数也被删去时，同时要更新map</li>
<li>获取随机元素，根据list的长度生成随机下标访问list。由于list在删除时可能有null，因此要使用循环，保证获取到的随机数也不是null</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>RandomizedCollection</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>Integer</span><span><span>,</span><span> </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> map</span></span><span><span>;</span><span> </span></span><span>// all key indices</span></div></div><div><div><div>4</div></div><div><span>    </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> list</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>Random</span><span> rand</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>8</div></div><div><span>    </span><span>public</span><span> </span><span>RandomizedCollection</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>map </span><span>=</span><span> </span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>list </span><span>=</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>rand </span><span>=</span><span> </span><span>new</span><span> </span><span>Random</span><span>();</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>/** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */</span></div></div><div><div><div>15</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>insert</span><span>(</span><span>int</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>16</div></div><div><span>        </span><span>list</span><span>.</span><span>add</span><span>(val);</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span>(val)) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>indexList</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>get</span><span>(val);</span></div></div><div><div><div>20</div></div><div><span>            </span><span>indexList</span><span>.</span><span>add</span><span>(</span><span>list</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>21</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(val, indexList);</span></div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>indexList</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>25</div></div><div><span>            </span><span>indexList</span><span>.</span><span>add</span><span>(</span><span>list</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>26</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(val, indexList);</span></div></div><div><div><div>27</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>/** Removes a value from the collection. Returns true if the collection contained the specified element. */</span></div></div><div><div><div>32</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>remove</span><span>(</span><span>int</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>33</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>indexList</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>get</span><span>(val);</span></div></div><div><div><div>34</div></div><div><span>        </span><span>if</span><span><span> (indexList </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>35</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>// always remove the first element</span></div></div><div><div><div>39</div></div><div><span>        </span><span>list</span><span>.</span><span>set</span><span>(</span><span>indexList</span><span>.</span><span>get</span><span>(</span><span>0</span><span>), </span><span>null</span><span>);</span></div></div><div><div><div>40</div></div><div><span>        </span><span>indexList</span><span>.</span><span>remove</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>41</div></div><div><span>        </span><span>if</span><span> (</span><span>indexList</span><span>.</span><span>size</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>42</div></div><div><span>            </span><span>map</span><span>.</span><span>remove</span><span>(val);</span></div></div><div><div><div>43</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span><span>    </span></span><span>/** Get a random element from the collection. */</span></div></div><div><div><div>48</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>getRandom</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>49</div></div><div><span>        </span><span>int</span><span><span> </span><span>random</span><span> </span></span><span><span>=</span><span> </span></span><span>rand</span><span>.</span><span>nextInt</span><span>(</span><span>list</span><span>.</span><span>size</span><span>());</span></div></div><div><div><div>50</div></div><div><span>        </span><span>while</span><span> (</span><span>list</span><span>.</span><span>get</span><span><span>(random) </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>51</div></div><div><span><span>            </span></span><span>random </span><span>=</span><span> </span><span>rand</span><span>.</span><span>nextInt</span><span>(</span><span>list</span><span>.</span><span>size</span><span>());</span></div></div><div><div><div>52</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span>        </span><span>return</span><span> </span><span>list</span><span>.</span><span>get</span><span>(random);</span></div></div><div><div><div>54</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>382. Linked List Random Node<a href="#382-linked-list-random-node"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/linked-list-random-node/" target="_blank">https://leetcode.com/problems/linked-list-random-node/</a></p><hr /><p>使用一个计数器<code>i</code>。遍历list，每遍历一个数计数器就加1，同时用一个随机数在<code>[0, i]</code>之间生成随机数，如果得到的数是<code>i</code>，就更新当前的值为当前的数。按此做法，如果遍历了<code>i</code>个数，能始终保持选中当前数的概率是<code>1/i</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>    </span><span>private</span><span> </span><span>ListNode</span><span> dummyHead</span><span>;</span></div></div><div><div><div>14</div></div><div><span>    </span><span>Random</span><span> random</span><span>;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>/** </span><span>@param</span><span> </span><span>head</span><span> The linked list's head.</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>Note that the head is guaranteed to be not null, so it contains at least one node. */</span></div></div><div><div><div>18</div></div><div><span>    </span><span>public</span><span> </span><span>Solution</span><span>(</span><span>ListNode</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>dummyHead </span><span>=</span><span> head;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>random </span><span>=</span><span> </span><span>new</span><span> </span><span>Random</span><span>();</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>/** Returns a random node's value. */</span></div></div><div><div><div>24</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>getRandom</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> dummyHead;</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>cur</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>; </span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>; i++) {</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>30</div></div><div><span>            </span><span>if</span><span> (</span><span>random</span><span>.</span><span>nextInt</span><span><span>(i </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>==</span><span> i) {</span></span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>cur</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>383. Ransom Note<a href="#383-ransom-note"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/ransom-note/" target="_blank">https://leetcode.com/problems/ransom-note/</a></p><hr /><p>map法，先检查<code>magazine</code>中每个字符有多少个，再判断<code>ransomNote</code>里够不够用。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>canConstruct</span><span>(</span><span>String</span><span><span> </span><span>ransomNote</span><span>, </span></span><span>String</span><span><span> </span><span>magazine</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (magazine </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>ransomNote</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>magazine</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>256</span><span>];</span></div></div><div><div><div>8</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span>(map, </span><span>0</span><span>);</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// occurrence map</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>magazine</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>map[c] </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// update map</span></div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>ransomNote</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>map[c] </span><span>-=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>18</div></div><div><span>            </span><span>if</span><span><span> (map[c] </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>384. Shuffle an Array<a href="#384-shuffle-an-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/shuffle-an-array/" target="_blank">https://leetcode.com/problems/shuffle-an-array/</a></p><hr /><p>每次shuffle时，使用一个循环，每次循环复制进来一个数，再将这个数与一个已经复制过的数进行交换。循环结束后，得到的新数组就是结果。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>Random</span><span> r </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Random</span><span><span>()</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] nums</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>Solution</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>this</span><span>.</span><span>nums</span><span><span> </span><span>=</span><span> nums;</span></span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>/** Resets the array to its original configuration and return it. */</span></div></div><div><div><div>11</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>reset</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span> nums;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>/** Returns a random shuffling of the array. */</span></div></div><div><div><div>16</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>shuffle</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>17</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>nums</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>result</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>result[i] </span><span>=</span><span> nums[i]; </span><span>// copy the original number</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>// swap this number with another copied number</span></div></div><div><div><div>22</div></div><div><span>            </span><span>int</span><span><span> </span><span>randomIdx</span><span> </span></span><span><span>=</span><span> </span></span><span>r</span><span>.</span><span>nextInt</span><span><span>(i</span><span>+</span></span><span>1</span><span>);</span></div></div><div><div><div>23</div></div><div><span>            </span><span>int</span><span><span> </span><span>tmp</span><span> </span></span><span><span>=</span><span> result[randomIdx];</span></span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>result[randomIdx] </span><span>=</span><span> result[i];</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>result[i] </span><span>=</span><span> tmp;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>385. Mini Parser<a href="#385-mini-parser"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/mini-parser/" target="_blank">https://leetcode.com/problems/mini-parser/</a></p><hr /><p>使用递归，对于NestedList而言，遇到<code>[</code>表示深度+1，遇到<code>]</code>表示深度-1。初始化深度是0，因此每一次递归调用时，应该要确保这一层能直接提取到的NestedInteger都在第0层；否则的话，就一定是一个NestedList。</p><p>具体获取时，使用<code>startIdx</code>计算下一个substring的起始坐标即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* // This is the interface that allows for creating nested lists.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* // You should not implement it, or speculate about its implementation</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>* public interface NestedInteger {</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     // Constructor initializes an empty nested list.</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     public NestedInteger();</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     // Constructor initializes a single integer.</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     public NestedInteger(int value);</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*     // </span><span>@return</span><span> true if this NestedInteger holds a single integer, rather than a nested list.</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*     public boolean isInteger();</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>*     // </span><span>@return</span><span> the single integer that this NestedInteger holds, if it holds a single integer</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*     // Return null if this NestedInteger holds a nested list</span></div></div><div><div><div>16</div></div><div><span><span> </span></span><span>*     public Integer getInteger();</span></div></div><div><div><div>17</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>18</div></div><div><span><span> </span></span><span>*     // Set this NestedInteger to hold a single integer.</span></div></div><div><div><div>19</div></div><div><span><span> </span></span><span>*     public void setInteger(int value);</span></div></div><div><div><div>20</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>21</div></div><div><span><span> </span></span><span>*     // Set this NestedInteger to hold a nested list and adds a nested integer to it.</span></div></div><div><div><div>22</div></div><div><span><span> </span></span><span>*     public void add(NestedInteger ni);</span></div></div><div><div><div>23</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>24</div></div><div><span><span> </span></span><span>*     // </span><span>@return</span><span> the nested list that this NestedInteger holds, if it holds a nested list</span></div></div><div><div><div>25</div></div><div><span><span> </span></span><span>*     // Return empty list if this NestedInteger holds a single integer</span></div></div><div><div><div>26</div></div><div><span><span> </span></span><span>*     public List&lt;NestedInteger&gt; getList();</span></div></div><div><div><div>27</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>28</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>29</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>30</div></div><div><span>    </span><span>public</span><span> </span><span>NestedInteger</span><span> </span><span>deserialize</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>NestedInteger</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>NestedInteger</span><span>();</span></div></div><div><div><div>32</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>33</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>// only one integer</span></div></div><div><div><div>37</div></div><div><span>        </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span>(</span><span>0</span><span><span>) </span><span>!=</span><span> </span></span><span>'['</span><span>) {</span></div></div><div><div><div>38</div></div><div><span>            </span><span>result</span><span>.</span><span>setInteger</span><span>(</span><span>Integer</span><span>.</span><span>parseInt</span><span>(s));</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>40</div></div><div><span>            </span><span>// a nestedlist and should not be '[]'</span></div></div><div><div><div>41</div></div><div><span>            </span><span>int</span><span><span> </span><span>startIdx</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>, depth </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>42</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>43</div></div><div><span>                </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span>                </span><span>// recursion to track nested depth, always start at current level with depth == 0</span></div></div><div><div><div>46</div></div><div><span>                </span><span>if</span><span><span> (depth </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> (c </span><span>==</span><span> </span></span><span>','</span><span><span> </span><span>||</span><span> i </span><span>==</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>)) {</span></div></div><div><div><div>47</div></div><div><span>                    </span><span>result</span><span>.</span><span>add</span><span>(</span><span>deserialize</span><span>(</span><span>s</span><span>.</span><span>substring</span><span>(startIdx, i)));</span></div></div><div><div><div>48</div></div><div><span><span>                    </span></span><span>startIdx </span><span>=</span><span> i </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>49</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'['</span><span>) {</span></div></div><div><div><div>50</div></div><div><span><span>                    </span></span><span>depth++;</span></div></div><div><div><div>51</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>']'</span><span>) {</span></div></div><div><div><div>52</div></div><div><span><span>                    </span></span><span>depth--;</span></div></div><div><div><div>53</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>56</div></div><div>
</div></div><div><div><div>57</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>58</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>59</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>386. Lexicographical Numbers<a href="#386-lexicographical-numbers"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/lexicographical-numbers/" target="_blank">https://leetcode.com/problems/lexicographical-numbers/</a></p><hr /><p>使用dfs，每次限定范围<code>[i*10, (i+1)*10]</code>进行遍历，即：保持当前的<code>i</code>，之后马上处理剩余位数，一直到<code>i*10</code>超出范围。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>lexicalOrder</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(n);</span></div></div><div><div><div>4</div></div><div><span>        </span><span>process</span><span>(result, </span><span>1</span><span>, </span><span>10</span><span>, n);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>process</span><span>(</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span>, </span></span><span>int</span><span><span> </span><span>start</span><span>, </span></span><span>int</span><span><span> </span><span>end</span><span>, </span></span><span>int</span><span><span> </span><span>limit</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> start; i </span><span>&lt;</span><span> end </span><span>&amp;&amp;</span><span> i </span><span>&lt;=</span><span> limit; i++) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(i);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>// keep current digits (i), and handle the rest of digits</span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>*</span><span> </span></span><span>10</span><span><span> </span><span>&lt;=</span><span> limit) {</span></span></div></div><div><div><div>14</div></div><div><span>                </span><span>process</span><span><span>(result, i</span><span>*</span></span><span>10</span><span><span>, (i</span><span>+</span></span><span>1</span><span><span>)</span><span>*</span></span><span>10</span><span>, limit);</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>387. First Unique Character in a String<a href="#387-first-unique-character-in-a-string"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/first-unique-character-in-a-string/" target="_blank">https://leetcode.com/problems/first-unique-character-in-a-string/</a></p><hr /><p>先使用map统计每个字符出现的频率，再从头开始检查第一个频率为1的字符。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>firstUniqChar</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>freq</span><span>[] </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// add frequency</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>freq[</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span>]++;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// check first letter which appears one time</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span> (freq[</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>return</span><span> i;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>388. Longest Absolute File Path<a href="#388-longest-absolute-file-path"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-absolute-file-path/" target="_blank">https://leetcode.com/problems/longest-absolute-file-path/</a></p><hr /><p>使用一个数组存储截止到每一层的路径长度。用<code>split()</code>函数去掉所有的<code>\n</code>，同时得到每一个文件的相对路径。根据每个相对路径前<code>\t</code>的长度能够得出这个文件位于第几层，因此截止到这个文件的长度就是上层所有文件夹的长度 + 当前路径的长度 - 当前路径前所有<code>\t</code>的长度。同时，如果发现当前路径包括<code>.</code>，说明这个路径已经是最终的文件路径，因此可以在此更新最大值结果。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>lengthLongestPath</span><span>(</span><span>String</span><span><span> </span><span>input</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>files</span><span> </span></span><span><span>=</span><span> </span></span><span>input</span><span>.</span><span>split</span><span>(</span><span>"</span><span>\n</span><span>"</span><span>);</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// store all levels' length</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>stack</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>files</span><span>.</span><span>length</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>stack[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>path</span><span> </span></span><span>:</span><span> files) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>int</span><span><span> </span><span>level</span><span> </span></span><span><span>=</span><span> </span></span><span>path</span><span>.</span><span>lastIndexOf</span><span>(</span><span>"</span><span>\t</span><span>"</span><span><span>) </span><span>+</span><span> </span></span><span>1</span><span>; </span><span>// get level</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>// upper directories' total length + current length - all '\t' length in current path</span></div></div><div><div><div>14</div></div><div><span>            </span><span>int</span><span><span> </span><span>curLength</span><span> </span></span><span><span>=</span><span> stack[level] </span><span>+</span><span> </span></span><span>path</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> level </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>stack[level </span><span>+</span><span> </span><span>1</span><span><span>] </span><span>=</span><span> curLength;</span></span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span> (</span><span>path</span><span>.</span><span>contains</span><span>(</span><span>"."</span><span>)) {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, curLength </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>389. Find the Difference<a href="#389-find-the-difference"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-the-difference/" target="_blank">https://leetcode.com/problems/find-the-difference/</a></p><hr /><p>使用位运算，对<code>s</code>和<code>t</code>中的每一个字母进行异或，最终的结果就是多出来的字母。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>char</span><span> </span><span>findTheDifference</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>String</span><span><span> </span><span>t</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>c </span><span>^=</span><span> </span><span>s</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>t</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>c </span><span>^=</span><span> </span><span>t</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>return</span><span> c;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>390. Elimination Game<a href="#390-elimination-game"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/elimination-game/" target="_blank">https://leetcode.com/problems/elimination-game/</a></p><hr /><p>跟踪当前剩下的第一个数字<code>head</code>，如果正在从左向右走，或者从右向左时剩下的数字有奇数个，第一个数字一定会被消掉，因此要将<code>head</code>挪到下一个数字。每一趟走完，更新方向、步长和剩余数字。最后<code>head</code>就是剩下的最后一个数字。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>lastRemaining</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>head</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>; </span><span>// head number</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>step</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>boolean</span><span><span> </span><span>leftToRight</span><span> </span></span><span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>remainNum</span><span> </span></span><span><span>=</span><span> n;</span></span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>while</span><span><span> (remainNum </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>// move head forward</span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span><span> (leftToRight </span><span>||</span><span> remainNum </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>head </span><span>=</span><span> head </span><span>+</span><span> step;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>            </span><span>// change direction and update step &amp; remain numbers</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>leftToRight </span><span>=</span><span> </span><span>!</span><span>leftToRight;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>step </span><span>=</span><span> step </span><span>*</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>remainNum </span><span>=</span><span> remainNum </span><span>/</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> head;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>391. Perfect Rectangle<a href="#391-perfect-rectangle"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/perfect-rectangle/" target="_blank">https://leetcode.com/problems/perfect-rectangle/</a></p><hr /><p>使用TreeSet，自定义comparator发现是否存在overlap，如果有的话根据Treeset重复性可以视其为重复元素；否则，就根据面积法校验，每次添加一个矩形，既要判断当前总的矩形面积和，又要计算所有矩形最外的坐标组成的大矩形的面积，判断这二者是否相等，如果不相等说明有缺角。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isRectangleCover</span><span>(</span><span>int</span><span><span>[][] </span><span>rectangles</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>minX</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span><span>, minY </span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>maxY</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, maxX </span><span>=</span><span> </span></span><span>0</span><span><span>, area </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>TreeSet</span><span>&lt;</span><span>int</span><span><span>[]&gt; </span><span>sortedRectangles</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeSet</span><span>&lt;&gt;((first, second) </span><span>-&gt;</span><span> {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span> (first[</span><span>0</span><span><span>] </span><span>&gt;=</span><span> second[</span></span><span>2</span><span><span>] </span><span>||</span><span> first[</span></span><span>1</span><span><span>] </span><span>&gt;=</span><span> second[</span></span><span>3</span><span>]) {</span></div></div><div><div><div>8</div></div><div><span>                </span><span>// second is on the right of first</span></div></div><div><div><div>9</div></div><div><span>                </span><span>return</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (first[</span><span>2</span><span><span>] </span><span>&lt;=</span><span> second[</span></span><span>0</span><span><span>] </span><span>||</span><span> first[</span></span><span>3</span><span><span>] </span><span>&lt;=</span><span> second[</span></span><span>1</span><span>]) {</span></div></div><div><div><div>11</div></div><div><span>                </span><span>// second is on the top of first</span></div></div><div><div><div>12</div></div><div><span>                </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>14</div></div><div><span>                </span><span>// overlap</span></div></div><div><div><div>15</div></div><div><span>                </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>});</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>rectangle</span><span> </span></span><span>:</span><span> rectangles) {</span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span> (</span><span>sortedRectangles</span><span>.</span><span>contains</span><span>(rectangle)) {</span></div></div><div><div><div>21</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>23</div></div><div><span>                </span><span>sortedRectangles</span><span>.</span><span>add</span><span>(rectangle);</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>minX </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(rectangle[</span><span>0</span><span>], minX);</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>minY </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(rectangle[</span><span>1</span><span>], minY);</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>maxX </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(rectangle[</span><span>2</span><span>], maxX);</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>maxY </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(rectangle[</span><span>3</span><span>], maxY);</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>area </span><span>+=</span><span> (rectangle[</span><span>3</span><span><span>] </span><span>-</span><span> rectangle[</span></span><span>1</span><span><span>]) </span><span>*</span><span> (rectangle[</span></span><span>2</span><span><span>] </span><span>-</span><span> rectangle[</span></span><span>0</span><span>]);</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span><span> area </span><span>==</span><span> (maxY </span><span>-</span><span> minY) </span><span>*</span><span> (maxX </span><span>-</span><span> minX);</span></span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>392. Is Subsequence<a href="#392-is-subsequence"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/is-subsequence/" target="_blank">https://leetcode.com/problems/is-subsequence/</a></p><hr /><p>双指针法，遍历<code>t</code>的时候检查<code>s</code>的字符是否满足，如果<code>s</code>的指针达到结尾说明符合条件。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isSubsequence</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>String</span><span><span> </span><span>t</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> t </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>sp</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, tp </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>while</span><span><span> (tp </span><span>&lt;</span><span> </span></span><span>t</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(sp) </span><span>==</span><span> </span></span><span>t</span><span>.</span><span>charAt</span><span>(tp)) {</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>sp++;</span></div></div><div><div><div>11</div></div><div><span>                </span><span>if</span><span><span> (sp </span><span>==</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>12</div></div><div><span>                    </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>tp++;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>393. UTF-8 Validation<a href="#393-utf-8-validation"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/utf-8-validation/" target="_blank">https://leetcode.com/problems/utf-8-validation/</a></p><hr /><p>非常无聊的题目，前提是要读懂utf-8的编码规则。。。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>validUtf8</span><span>(</span><span>int</span><span><span>[] </span><span>data</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> data) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>if</span><span><span> (count </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>                </span><span>if</span><span><span> ((c </span><span>&gt;&gt;</span><span> </span></span><span>5</span><span><span>) </span><span>==</span><span> </span></span><span>0b110</span><span>) {</span></div></div><div><div><div>7</div></div><div><span><span>                    </span></span><span>count </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> ((c </span><span>&gt;&gt;</span><span> </span></span><span>4</span><span><span>) </span><span>==</span><span> </span></span><span>0b1110</span><span>) {</span></div></div><div><div><div>9</div></div><div><span><span>                    </span></span><span>count </span><span>=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> ((c </span><span>&gt;&gt;</span><span> </span></span><span>3</span><span><span>) </span><span>==</span><span> </span></span><span>0b11110</span><span>) {</span></div></div><div><div><div>11</div></div><div><span><span>                    </span></span><span>count </span><span>=</span><span> </span><span>3</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> ((c </span><span>&gt;&gt;</span><span> </span></span><span>7</span><span><span>) </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>13</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>16</div></div><div><span>                </span><span>if</span><span><span> ((c </span><span>&gt;&gt;</span><span> </span></span><span>6</span><span><span>) </span><span>!=</span><span> </span></span><span>0b10</span><span>) {</span></div></div><div><div><div>17</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>count--;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span><span> count </span><span>==</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>394. Decode String<a href="#394-decode-string"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/decode-string/" target="_blank">https://leetcode.com/problems/decode-string/</a></p><hr /><p>使用两个栈，一个栈存字符串重复的次数，另一个存处理好的子字符串。遍历输入字符串，根据 数字 / <code>[</code> / <code>]</code> / 其他字符 这四种情况进行讨论处理。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>decodeString</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>cStack</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;&gt;();</span></div></div><div><div><div>5</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>strStack</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;&gt;();</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>while</span><span><span> (index </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>// get repeated times</span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(index) </span><span>&gt;=</span><span> </span></span><span>'0'</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span><span>(index) </span><span>&lt;=</span><span> </span></span><span>'9'</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>                </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>12</div></div><div><span>                </span><span>while</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(index) </span><span>&gt;=</span><span> </span></span><span>'0'</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span><span>(index) </span><span>&lt;=</span><span> </span></span><span>'9'</span><span>) {</span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>count </span><span>=</span><span> </span><span>10</span><span><span> </span><span>*</span><span> count </span><span>+</span><span> (</span></span><span>s</span><span>.</span><span>charAt</span><span><span>(index) </span><span>-</span><span> </span></span><span>'0'</span><span>);</span></div></div><div><div><div>14</div></div><div><span><span>                    </span></span><span>index++;</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>                </span><span>cStack</span><span>.</span><span>push</span><span>(count);</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(index) </span><span>==</span><span> </span></span><span>'['</span><span>) {</span></div></div><div><div><div>18</div></div><div><span>                </span><span>// store current string, and prepare to get new string</span></div></div><div><div><div>19</div></div><div><span>                </span><span>strStack</span><span>.</span><span>push</span><span>(</span><span>sb</span><span>.</span><span>toString</span><span>());</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>sb </span><span>=</span><span> </span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>index++;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(index) </span><span>==</span><span> </span></span><span>']'</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>                </span><span>// repeat times of current finished string</span></div></div><div><div><div>24</div></div><div><span>                </span><span>int</span><span><span> </span><span>repeat</span><span> </span></span><span><span>=</span><span> </span></span><span>cStack</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>                </span><span>StringBuilder</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>(</span><span>strStack</span><span>.</span><span>pop</span><span>());</span></div></div><div><div><div>27</div></div><div><span>                </span><span>String</span><span><span> </span><span>str</span><span> </span></span><span><span>=</span><span> </span></span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>28</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> repeat; i++) {</span></span></div></div><div><div><div>29</div></div><div><span>                    </span><span>// add repeated string</span></div></div><div><div><div>30</div></div><div><span>                    </span><span>temp</span><span>.</span><span>append</span><span>(str);</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>                </span><span>// replace current string builder</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>sb </span><span>=</span><span> temp;</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>index++;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>37</div></div><div><span>                </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span>(index));</span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>index++;</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>395. Longest Substring with At Least K Repeating Characters<a href="#395-longest-substring-with-at-least-k-repeating-characters"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-substring-with-at-least-k-repeating-characters/" target="_blank">https://leetcode.com/problems/longest-substring-with-at-least-k-repeating-characters/</a></p><hr /><p>先获取到总的字符串的字母频率，再检查每一个子字符串范围内的字母频率，判断这一段内是否每个字母都满足要求。如果发现一个字母不满足，就拆分搜索，寻找这个字母之前或之后范围内的子字符串。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>longestSubstring</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (k </span><span>&lt;</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> </span><span>s</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>        </span><span>return</span><span> </span><span>helper</span><span>(s, </span><span>0</span><span>, </span><span>s</span><span>.</span><span>length</span><span>(), k);</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>helper</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>int</span><span><span> </span><span>l</span><span>, </span></span><span>int</span><span><span> </span><span>r</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (l </span><span>&gt;=</span><span> r) {</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// build freq map</span></div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>freq</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>19</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> l; i </span><span>&lt;</span><span> r; i++) {</span></span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>freq[</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span>]++;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>// check if valid</span></div></div><div><div><div>24</div></div><div><span>        </span><span>boolean</span><span><span> </span><span>valid</span><span> </span></span><span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>25</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>26</span><span><span> </span><span>&amp;&amp;</span><span> valid; i++) {</span></span></div></div><div><div><div>26</div></div><div><span>            </span><span>if</span><span><span> (freq[i] </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> freq[i] </span><span>&lt;</span><span> k) {</span></span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>valid </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>        </span><span>if</span><span> (valid) {</span></div></div><div><div><div>31</div></div><div><span>            </span><span>return</span><span><span> r</span><span>-</span><span>l;</span></span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>// if not for each invalid character start a new split search</span></div></div><div><div><div>35</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, start </span><span>=</span><span> l;</span></span></div></div><div><div><div>36</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> l; i </span><span>&lt;</span><span> r; i++) {</span></span></div></div><div><div><div>37</div></div><div><span>            </span><span>if</span><span> (freq[</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span></span><span>'a'</span><span><span>] </span><span>&lt;</span><span> k) {</span></span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, </span><span>helper</span><span>(s, start, i, k));</span></div></div><div><div><div>39</div></div><div><span><span>                </span></span><span>start </span><span>=</span><span> i</span><span>+</span><span>1</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>        </span><span>// complete search</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, </span><span>helper</span><span>(s, start, r, k));</span></div></div><div><div><div>45</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>46</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>396. Rotate Function<a href="#396-rotate-function"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/rotate-function/" target="_blank">https://leetcode.com/problems/rotate-function/</a></p><hr /><p>数学推导：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>F(k) = 0 * Bk[0] + 1 * Bk[1] + ... + (n-1) * Bk[n-1]</span></div></div><div><div><div>2</div></div><div><span>F(k-1) = 0 * Bk-1[0] + 1 * Bk-1[1] + ... + (n-1) * Bk-1[n-1]</span></div></div><div><div><div>3</div></div><div><span><span>       </span></span><span>= 0 * Bk[1] + 1 * Bk[2] + ... + (n-2) * Bk[n-1] + (n-1) * Bk[0]</span></div></div><div><div><div>4</div></div><div><span>F(k) - F(k-1) = Bk[1] + Bk[2] + ... + Bk[n-1] + (1-n)Bk[0]</span></div></div><div><div><div>5</div></div><div><span><span>              </span></span><span>= (Bk[0] + ... + Bk[n-1]) - nBk[0]</span></div></div><div><div><div>6</div></div><div><span><span>              </span></span><span>= sum - nBk[0]</span></div></div><div><div><div>7</div></div><div><span>F(k) = F(k-1) + sum - nBk[0]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>对于<code>Bk[0]</code>，有：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>k = 0; B[0] = A[0];</span></div></div><div><div><div>2</div></div><div><span>k = 1; B[0] = A[len-1];</span></div></div><div><div><div>3</div></div><div><span>k = 2; B[0] = A[len-2];</span></div></div><div><div><div>4</div></div><div><span>...</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxRotateFunction</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>F</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>F </span><span>+=</span><span> i </span><span>*</span><span> nums[i];</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>sum </span><span>+=</span><span> nums[i];</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> F;</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>1</span><span>; i--) {</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>F </span><span>=</span><span> F </span><span>+</span><span> sum </span><span>-</span><span> len </span><span>*</span><span> nums[i];</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(F, result);</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>397. Integer Replacement<a href="#397-integer-replacement"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/integer-replacement/" target="_blank">https://leetcode.com/problems/integer-replacement/</a></p><hr /><p>主要根据是否为<code>4k+3</code>型的整数进行判断，决定递归时用+1还是-1。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>integerReplacement</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>return</span><span> </span><span>1</span><span><span> </span><span>+</span><span> </span></span><span>integerReplacement</span><span><span>(n </span><span>/</span><span> </span></span><span>2</span><span>);</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span><span> n </span><span>%</span><span> </span></span><span>4</span><span><span> </span><span>==</span><span> </span></span><span>3</span><span> </span><span>?</span><span> </span><span>2</span><span><span> </span><span>+</span><span> </span></span><span>integerReplacement</span><span><span>(n </span><span>/</span><span> </span></span><span>2</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>) </span><span>:</span><span> </span><span>2</span><span><span> </span><span>+</span><span> </span></span><span>integerReplacement</span><span><span>(n </span><span>/</span><span> </span></span><span>2</span><span>);</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>398. Random Pick Index<a href="#398-random-pick-index"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/random-pick-index/" target="_blank">https://leetcode.com/problems/random-pick-index/</a></p><hr /><p>用HashMap存储每个数出现的所有下标，<code>pick()</code>的时候再随机抽一个。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] nums</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>Integer</span><span><span>,</span><span> </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> map</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>Random</span><span> random</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>Solution</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>this</span><span>.</span><span>nums</span><span><span> </span><span>=</span><span> nums;</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>this</span><span>.</span><span>random</span><span><span> </span><span>=</span><span> </span></span><span>new</span><span> </span><span>Random</span><span>();</span></div></div><div><div><div>9</div></div><div><span>        </span><span>this</span><span>.</span><span>map</span><span><span> </span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span> (</span><span>this</span><span>.</span><span>map</span><span>.</span><span>containsKey</span><span>(nums[i])) {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>list</span><span> </span></span><span><span>=</span><span> </span></span><span>this</span><span>.</span><span>map</span><span>.</span><span>get</span><span>(nums[i]);</span></div></div><div><div><div>14</div></div><div><span>                </span><span>list</span><span>.</span><span>add</span><span>(i);</span></div></div><div><div><div>15</div></div><div><span>                </span><span>this</span><span>.</span><span>map</span><span>.</span><span>put</span><span>(nums[i], list);</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>17</div></div><div><span>                </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>list</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>18</div></div><div><span>                </span><span>list</span><span>.</span><span>add</span><span>(i);</span></div></div><div><div><div>19</div></div><div><span>                </span><span>this</span><span>.</span><span>map</span><span>.</span><span>put</span><span>(nums[i], list);</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>pick</span><span>(</span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>list</span><span> </span></span><span><span>=</span><span> </span></span><span>this</span><span>.</span><span>map</span><span>.</span><span>get</span><span>(target);</span></div></div><div><div><div>26</div></div><div><span>        </span><span>int</span><span><span> </span><span>idx</span><span> </span></span><span><span>=</span><span> </span></span><span>random</span><span>.</span><span>nextInt</span><span>(</span><span>list</span><span>.</span><span>size</span><span>());</span></div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> </span><span>list</span><span>.</span><span>get</span><span>(idx);</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>399. Evaluate Division<a href="#399-evaluate-division"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/evaluate-division/" target="_blank">https://leetcode.com/problems/evaluate-division/</a></p><hr /><p>自定义一个图的结构，对于每一个节点，存储和这个点连接的所有边（每条边记录另一个节点，以及这条边对应的数值）。之后在query里使用dfs，根据边的连通性判断是否能实现除法操作。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>class</span><span><span> </span><span>Edge</span><span> </span></span><span>{</span></div></div><div><div><div>3</div></div><div><span>        </span><span>String</span><span> v</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>double</span><span> d</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>public</span><span> </span><span>Edge</span><span>(</span><span>String</span><span><span> </span><span>v</span><span>, </span></span><span>double</span><span><span> </span><span>d</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>this</span><span>.</span><span>v</span><span><span> </span><span>=</span><span> v;</span></span></div></div><div><div><div>8</div></div><div><span>            </span><span>this</span><span>.</span><span>d</span><span><span> </span><span>=</span><span> d;</span></span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span>private</span><span> </span><span>double</span><span> </span><span>dfs</span><span>(</span><span>Map</span><span>&lt;</span><span>String</span><span>, </span><span>List</span><span>&lt;</span><span>Edge</span><span><span>&gt;&gt; </span><span>map</span><span>, </span></span><span>Edge</span><span><span> </span><span>root</span><span>, </span></span><span>String</span><span><span> </span><span>dst</span><span>, </span></span><span>double</span><span><span> </span><span>cur</span><span>, </span></span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>visited</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>v</span><span>.</span><span>equals</span><span>(dst)) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> cur;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span> (</span><span>visited</span><span>.</span><span>contains</span><span>(root)) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>return</span><span> cur;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>visited</span><span>.</span><span>add</span><span>(</span><span>root</span><span>.</span><span>v</span><span>);</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span> (</span><span>map</span><span>.</span><span>get</span><span>(</span><span>root</span><span>.</span><span>v</span><span><span>) </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>for</span><span> (</span><span>Edge</span><span><span> </span><span>e</span><span> </span></span><span>:</span><span> </span><span>map</span><span>.</span><span>get</span><span>(</span><span>root</span><span>.</span><span>v</span><span>)) {</span></div></div><div><div><div>24</div></div><div><span>                </span><span>if</span><span><span> (</span><span>!</span></span><span>visited</span><span>.</span><span>contains</span><span>(</span><span>e</span><span>.</span><span>v</span><span>)) {</span></div></div><div><div><div>25</div></div><div><span>                    </span><span>double</span><span><span> </span><span>tr</span><span> </span></span><span><span>=</span><span> </span></span><span>dfs</span><span>(map, e, dst, cur, visited);</span></div></div><div><div><div>26</div></div><div><span>                    </span><span>if</span><span><span> (tr </span><span>!=</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>                        </span><span>return</span><span><span> tr </span><span>*</span><span> </span></span><span>e</span><span>.</span><span>d</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>        </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>    </span><span>public</span><span> </span><span>double</span><span>[] </span><span>calcEquation</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>equations</span><span>, </span></span><span>double</span><span><span>[] </span><span>values</span><span>, </span></span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>queries</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>36</div></div><div><span>        </span><span>// each graph is &lt;vertex, all edges connected to vertex&gt;</span></div></div><div><div><div>37</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>String</span><span>, </span><span>List</span><span>&lt;</span><span>Edge</span><span><span>&gt;&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>38</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>equations</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>// add all existed edge to the graph</span></div></div><div><div><div>41</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>42</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>e</span><span> </span></span><span><span>=</span><span> </span></span><span>equations</span><span>.</span><span>get</span><span>(i);</span></div></div><div><div><div>43</div></div><div><span>            </span><span>map</span><span>.</span><span>putIfAbsent</span><span>(</span><span>e</span><span>.</span><span>get</span><span>(</span><span>0</span><span>), </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>Edge</span><span>&gt;());</span></div></div><div><div><div>44</div></div><div><span>            </span><span>map</span><span>.</span><span>putIfAbsent</span><span>(</span><span>e</span><span>.</span><span>get</span><span>(</span><span>1</span><span>), </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>Edge</span><span>&gt;());</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>            </span><span>map</span><span>.</span><span>get</span><span>(</span><span>e</span><span>.</span><span>get</span><span>(</span><span>0</span><span>)).</span><span>add</span><span>(</span><span>new</span><span> </span><span>Edge</span><span>(</span><span>e</span><span>.</span><span>get</span><span>(</span><span>1</span><span>), values[i]));</span></div></div><div><div><div>47</div></div><div><span>            </span><span>map</span><span>.</span><span>get</span><span>(</span><span>e</span><span>.</span><span>get</span><span>(</span><span>1</span><span>)).</span><span>add</span><span>(</span><span>new</span><span> </span><span>Edge</span><span>(</span><span>e</span><span>.</span><span>get</span><span>(</span><span>0</span><span>), </span><span>1.0</span><span><span> </span><span>/</span><span> values[i]));</span></span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>        </span><span>double</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>double</span><span>[</span><span>queries</span><span>.</span><span>size</span><span>()];</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>        </span><span>int</span><span><span> </span><span>idx</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>53</div></div><div><span>        </span><span>for</span><span> (</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>q</span><span> </span></span><span>:</span><span> queries) {</span></div></div><div><div><div>54</div></div><div><span>            </span><span>String</span><span><span> </span><span>src</span><span> </span></span><span><span>=</span><span> </span></span><span>q</span><span>.</span><span>get</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>55</div></div><div><span>            </span><span>String</span><span><span> </span><span>dst</span><span> </span></span><span><span>=</span><span> </span></span><span>q</span><span>.</span><span>get</span><span>(</span><span>1</span><span>);</span></div></div><div><div><div>56</div></div><div>
</div></div><div><div><div>57</div></div><div><span>            </span><span>// undefined node</span></div></div><div><div><div>58</div></div><div><span>            </span><span>if</span><span> (</span><span>map</span><span>.</span><span>get</span><span><span>(src) </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>map</span><span>.</span><span>get</span><span><span>(dst) </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>59</div></div><div><span><span>                </span></span><span>result[idx++] </span><span>=</span><span> </span><span>-</span><span>1</span><span>;</span></div></div><div><div><div>60</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>61</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>62</div></div><div>
</div></div><div><div><div>63</div></div><div><span>            </span><span>// self</span></div></div><div><div><div>64</div></div><div><span>            </span><span>if</span><span><span> (src </span><span>==</span><span> dst) {</span></span></div></div><div><div><div>65</div></div><div><span><span>                </span></span><span>result[idx++] </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>66</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>67</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>68</div></div><div>
</div></div><div><div><div>69</div></div><div><span>            </span><span>double</span><span><span> </span><span>dis</span><span> </span></span><span><span>=</span><span> </span></span><span>dfs</span><span>(map, </span><span>new</span><span> </span><span>Edge</span><span>(src, </span><span>1</span><span>), dst, </span><span>1</span><span>, </span><span>new</span><span> </span><span>HashSet</span><span>&lt;</span><span>String</span><span>&gt;());</span></div></div><div><div><div>70</div></div><div><span><span>            </span></span><span>result[idx++] </span><span>=</span><span> dis;</span></div></div><div><div><div>71</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>72</div></div><div>
</div></div><div><div><div>73</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>74</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>75</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>400. Nth Digit<a href="#400-nth-digit"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/nth-digit/" target="_blank">https://leetcode.com/problems/nth-digit/</a></p><hr /><ol>
<li>确定第<code>n</code>位数处在一个几位整数中</li>
<li>确定第<code>n</code>位数处在哪一个整数中</li>
<li>转String后直接用字符串相关函数提取</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findNthDigit</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>; </span><span>// the length of the number where the nth digit is from</span></div></div><div><div><div>4</div></div><div><span>        </span><span>long</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>9</span><span>; </span><span>// how many numbers in current length</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>start</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>; </span><span>// start of current length number</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>while</span><span><span> (n </span><span>&gt;</span><span> len </span><span>*</span><span> count) {</span></span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>n </span><span>-=</span><span> len </span><span>*</span><span> count;</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>len </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>count </span><span>*=</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>start </span><span>*=</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>// the number which contains Nth digit</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>start </span><span>+=</span><span> (n </span><span>-</span><span> </span><span>1</span><span><span>) </span><span>/</span><span> len;</span></span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>String</span><span><span> </span><span>s</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>toString</span><span>(start);</span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> </span><span>Character</span><span>.</span><span>getNumericValue</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span><span>((n </span><span>-</span><span> </span></span><span>1</span><span><span>) </span><span>%</span><span> len));</span></span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2020-01-01-leetcode401-500/</id>
      <title type="text">LeetCode 401-500</title>
      <published>2020-01-01T00:00:00.000Z</published>
      <updated>2020-01-01T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2020-01-01-leetcode401-500/"/>
      <summary type="text">LeetCode Problems 401-500.</summary>
      <content type="html"><![CDATA[<p>LeetCode Problems 401-500.</p>

<section><h2>401. Binary Watch<a href="#401-binary-watch"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-watch/" target="_blank">https://leetcode.com/problems/binary-watch/</a></p><hr /><p>直接调用<code>Integer.bitCount()</code>函数，如果时和分中的1相加等于<code>turnedOn</code>，就添加到结果中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>readBinaryWatch</span><span>(</span><span>int</span><span><span> </span><span>turnedOn</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>hour</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; hour </span><span>&lt;</span><span> </span></span><span>12</span><span>; hour++) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>minute</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; minute </span><span>&lt;</span><span> </span></span><span>60</span><span>; minute++) {</span></div></div><div><div><div>7</div></div><div><span>                </span><span>if</span><span> (</span><span>Integer</span><span>.</span><span>bitCount</span><span><span>(hour) </span><span>+</span><span> </span></span><span>Integer</span><span>.</span><span>bitCount</span><span><span>(minute) </span><span>==</span><span> turnedOn) {</span></span></div></div><div><div><div>8</div></div><div><span>                    </span><span>result</span><span>.</span><span>add</span><span><span>(hour </span><span>+</span><span> (minute </span><span>&lt;</span><span> </span></span><span>10</span><span> </span><span>?</span><span> </span><span>":0"</span><span> </span><span>:</span><span> </span><span>":"</span><span><span>) </span><span>+</span><span> minute);</span></span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>402. Remove K Digits<a href="#402-remove-k-digits"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/remove-k-digits/" target="_blank">https://leetcode.com/problems/remove-k-digits/</a></p><hr /><p>遍历字符串，找到递减序列，定位到第一个需要被替换的“大”数字，从之后找到更小的数字覆盖它。如果循环结束后，<code>k</code>的次数仍有剩余，根据<code>end</code>和<code>k</code>的大小关系，判断返回值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>removeKdigits</span><span>(</span><span>String</span><span><span> </span><span>num</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>end</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>array</span><span> </span></span><span><span>=</span><span> </span></span><span>num</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>num</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>// encounter a decreasing sequence, locate the digit to be overwritten</span></div></div><div><div><div>8</div></div><div><span>            </span><span>while</span><span><span> (end </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> k </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> array[end </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>&gt;</span><span> array[i]) {</span></span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>k--;</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>end--;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>// skip leading '0' and overwrite one digit with a digit after</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span><span> (end </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> array[i] </span><span>!=</span><span> </span></span><span>'0'</span><span>) {</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>array[end] </span><span>=</span><span> array[i];</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>end++;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// if there are still k left, return 0 or truncate the last k digits</span></div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span><span> end </span><span>&lt;=</span><span> k </span></span><span>?</span><span> </span><span>"0"</span><span> </span><span>:</span><span> </span><span>String</span><span>.</span><span>valueOf</span><span>(array, </span><span>0</span><span><span>, end </span><span>-</span><span> k);</span></span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>403. Frog Jump<a href="#403-frog-jump"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/frog-jump/" target="_blank">https://leetcode.com/problems/frog-jump/</a></p><hr /><p>DFS思想，每一跳都尝试三种长度可能。同时可以用一个map存储每个下标与对应的<code>k</code>值，如果我们此前已经用<code>k</code>值到达过这个下标，就记录下来，避免之后重复DFS。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>// &lt;index, set of all possible k&gt;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>Map</span><span>&lt;</span><span>Integer</span><span><span>,</span><span> </span></span><span>Set</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> checked </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>canCross</span><span>(</span><span>int</span><span><span>[] </span><span>stones</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>stones</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>checked</span><span>.</span><span>put</span><span>(stones[i], </span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;());</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>        </span><span>return</span><span> </span><span>helper</span><span>(</span><span>0</span><span>, </span><span>1</span><span>, stones[</span><span>stones</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>]);</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>helper</span><span>(</span><span>int</span><span><span> </span><span>current</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>, </span></span><span>int</span><span><span> </span><span>last</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (current </span><span>==</span><span> last) {</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// skip if we have checked this k at the current stone</span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (k </span><span>&lt;=</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>checked</span><span>.</span><span>get</span><span>(current).</span><span>contains</span><span>(k)) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>int</span><span><span> </span><span>next</span><span> </span></span><span><span>=</span><span> current </span><span>+</span><span> k;</span></span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span> (</span><span>checked</span><span>.</span><span>containsKey</span><span>(next)) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>if</span><span> (</span><span>helper</span><span><span>(next, k </span><span>-</span><span> </span></span><span>1</span><span><span>, last) </span><span>||</span><span> </span></span><span>helper</span><span><span>(next, k, last) </span><span>||</span><span> </span></span><span>helper</span><span><span>(next, k </span><span>+</span><span> </span></span><span>1</span><span>, last)) {</span></div></div><div><div><div>25</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>        </span><span>checked</span><span>.</span><span>get</span><span>(current).</span><span>add</span><span>(k);</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>404. Sum of Left Leaves<a href="#404-sum-of-left-leaves"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sum-of-left-leaves/" target="_blank">https://leetcode.com/problems/sum-of-left-leaves/</a></p><hr /><p>从根节点开始：</p><ol>
<li>如果<code>root.left</code>不空，则检查左子树
<ul>
<li>如果<code>root.left.left</code>已经是叶节点，直接加上它的值</li>
<li>否则，递归加上左子树中所有左叶节点的和</li>
</ul>
</li>
<li>如果<code>root.right</code>不空，检查右子树中所有左叶节点的和</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>sumOfLeftLeaves</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>left</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>if</span><span> (</span><span>root</span><span>.</span><span>left</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>root</span><span>.</span><span>left</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> </span><span>root</span><span>.</span><span>left</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> </span><span>sumOfLeftLeaves</span><span>(</span><span>root</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>right</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> </span><span>sumOfLeftLeaves</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>405. Convert a Number to Hexadecimal<a href="#405-convert-a-number-to-hexadecimal"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/convert-a-number-to-hexadecimal/" target="_blank">https://leetcode.com/problems/convert-a-number-to-hexadecimal/</a></p><hr /><p>使用循环，每次提取<code>num</code>最后4位转成16进制，再将最后的结果倒转。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>toHex</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (num </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>"0"</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[] {</span><span>'0'</span><span>, </span><span>'1'</span><span>, </span><span>'2'</span><span>, </span><span>'3'</span><span>, </span><span>'4'</span><span>, </span><span>'5'</span><span>, </span><span>'6'</span><span>, </span><span>'7'</span><span>, </span><span>'8'</span><span>, </span><span>'9'</span><span>, </span><span>'a'</span><span>, </span><span>'b'</span><span>, </span><span>'c'</span><span>, </span><span>'d'</span><span>, </span><span>'e'</span><span>, </span><span>'f'</span><span>};</span></div></div><div><div><div>8</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>9</div></div><div><span>        </span><span>while</span><span><span> (num </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>// transform last 4 bits to hex</span></div></div><div><div><div>11</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span><span>(map[num </span><span>&amp;</span><span> </span></span><span>15</span><span>]);</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>// get rid of the last 4 bits</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>num </span><span>&gt;&gt;&gt;=</span><span> </span><span>4</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>reverse</span><span>().</span><span>toString</span><span>();</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>406. Queue Reconstruction by Height<a href="#406-queue-reconstruction-by-height"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/queue-reconstruction-by-height/" target="_blank">https://leetcode.com/problems/queue-reconstruction-by-height/</a></p><hr /><p>本质而言，队列的恢复是一个排序并且重新插入元素的过程。</p><ol>
<li>对输入数组进行排序。排序规则是：默认按照<code>h</code>（身高）进行排序，身高越高排在越前面；身高一样时，按照<code>k</code>（面前身高大于等于<code>h</code>的人数）进行排序，人数越少越靠前</li>
<li>把排序好的队列插入到List中，注意插入时需要参考<code>k</code>值，<code>k</code>值是多少就插入到哪个位置。因为上一步中已经排序，而此时又是按照排序后的顺序进行遍历，因此<code>k</code>值相同时，身高矮的人比身高高的人后插入，起到了调整顺序的作用</li>
</ol><p>最后，把List转为array即可。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[][] </span><span>reconstructQueue</span><span>(</span><span>int</span><span><span>[][] </span><span>people</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(people, (a, b) </span><span>-&gt;</span><span> (a[</span><span>0</span><span><span>] </span><span>==</span><span> b[</span></span><span>0</span><span>] </span><span>?</span><span> a[</span><span>1</span><span><span>] </span><span>-</span><span> b[</span></span><span>1</span><span>] </span><span>:</span><span> b[</span><span>0</span><span><span>] </span><span>-</span><span> a[</span></span><span>0</span><span>]));</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>int</span><span><span>[]&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>p</span><span> </span></span><span>:</span><span> people) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(p[</span><span>1</span><span>], p);</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>return</span><span> </span><span>result</span><span>.</span><span>toArray</span><span>(</span><span>new</span><span> </span><span>int</span><span>[</span><span>result</span><span>.</span><span>size</span><span>()][]);</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>407. Trapping Rain Water II<a href="#407-trapping-rain-water-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/trapping-rain-water-ii/" target="_blank">https://leetcode.com/problems/trapping-rain-water-ii/</a></p><hr /><p>核心思路是：把每个block定义成Comparable的object，这样能够利用Priority Queue根据每个<code>Block</code>的高度进行排序。之后，从map的四条边缘开始，把四条边上的所有<code>Block</code>加入到Priority Queue中，开始进行BFS遍历。</p><p>BFS遍历的流程是：从边缘<code>Block</code>开始，向四个方向的邻近<code>Block</code>遍历，筛除掉超过map边界和已访问<code>Block</code>的情况。之后按照高度进行判断：如果邻近的<code>Block</code>比现有的这个更高，就把它加入到Priority Queue中，用于后续进一步的判断，并且中止BFS；而如果它更矮，说明可以trap一些水，水的体积就是两个<code>Block</code>的高度差，并且继续进行BFS。</p><p>因为使用了Priority Queue，因此能够确保遍历<code>Block</code>的时候一定是按照从低到高的顺序开始，因此能保证这种方式trap的水量是最大的。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> water </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span>[][] visited</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> visitedCnt </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>private</span><span> </span><span>static</span><span> </span><span>class</span><span><span> </span><span>Block</span><span> </span></span><span>implements</span><span><span> </span><span>Comparable</span><span>&lt;</span><span>Block</span><span>&gt;</span><span> </span></span><span>{</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span> row</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span> col</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span> value</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>Block</span><span>(</span><span>int</span><span><span> </span><span>row</span><span>, </span></span><span>int</span><span><span> </span><span>col</span><span>, </span></span><span>int</span><span><span> </span><span>value</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>this</span><span>.</span><span>row</span><span><span> </span><span>=</span><span> row;</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>this</span><span>.</span><span>col</span><span><span> </span><span>=</span><span> col;</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>this</span><span>.</span><span>value</span><span><span> </span><span>=</span><span> value;</span></span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>@</span><span>Override</span></div></div><div><div><div>18</div></div><div><span>        </span><span>public</span><span> </span><span>int</span><span> </span><span>compareTo</span><span>(</span><span>Block</span><span><span> </span><span>block</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span><span> value </span><span>-</span><span> </span></span><span>block</span><span>.</span><span>value</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>trapRainWater</span><span>(</span><span>int</span><span><span>[][] </span><span>heightMap</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (heightMap </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>heightMap</span><span>.</span><span>length</span><span><span> </span><span>&lt;</span><span> </span></span><span>3</span><span><span> </span><span>||</span><span> heightMap[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>&lt;</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>int</span><span><span> </span><span>rows</span><span> </span></span><span><span>=</span><span> </span></span><span>heightMap</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>29</div></div><div><span>        </span><span>int</span><span><span> </span><span>cols</span><span> </span></span><span><span>=</span><span> heightMap[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>30</div></div><div><span>        </span><span>PriorityQueue</span><span>&lt;</span><span>Block</span><span><span>&gt; </span><span>pq</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;</span><span>Block</span><span>&gt;();</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>visited </span><span>=</span><span> </span><span>new</span><span> </span><span>boolean</span><span>[rows][cols];</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>// add row edge blocks to priority queue</span></div></div><div><div><div>34</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> cols; i++) {</span></span></div></div><div><div><div>35</div></div><div><span>            </span><span>Block</span><span><span> </span><span>block1</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Block</span><span>(</span><span>0</span><span>, i, heightMap[</span><span>0</span><span>][i]);</span></div></div><div><div><div>36</div></div><div><span>            </span><span>Block</span><span><span> </span><span>block2</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Block</span><span><span>(rows </span><span>-</span><span> </span></span><span>1</span><span><span>, i, heightMap[rows </span><span>-</span><span> </span></span><span>1</span><span>][i]);</span></div></div><div><div><div>37</div></div><div><span>            </span><span>pq</span><span>.</span><span>offer</span><span>(block1);</span></div></div><div><div><div>38</div></div><div><span>            </span><span>pq</span><span>.</span><span>offer</span><span>(block2);</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>visited[</span><span>0</span><span><span>][i] </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>visited[rows </span><span>-</span><span> </span><span>1</span><span><span>][i] </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>visitedCnt </span><span>+=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>        </span><span>// add column edge blocks to priority queue</span></div></div><div><div><div>45</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> rows </span><span>-</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>46</div></div><div><span>            </span><span>Block</span><span><span> </span><span>block1</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Block</span><span>(i, </span><span>0</span><span>, heightMap[i][</span><span>0</span><span>]);</span></div></div><div><div><div>47</div></div><div><span>            </span><span>Block</span><span><span> </span><span>block2</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Block</span><span><span>(i, cols </span><span>-</span><span> </span></span><span>1</span><span><span>, heightMap[i][cols </span><span>-</span><span> </span></span><span>1</span><span>]);</span></div></div><div><div><div>48</div></div><div><span>            </span><span>pq</span><span>.</span><span>offer</span><span>(block1);</span></div></div><div><div><div>49</div></div><div><span>            </span><span>pq</span><span>.</span><span>offer</span><span>(block2);</span></div></div><div><div><div>50</div></div><div><span><span>            </span></span><span>visited[i][</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>51</div></div><div><span><span>            </span></span><span>visited[i][cols </span><span>-</span><span> </span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>52</div></div><div><span><span>            </span></span><span>visitedCnt </span><span>+=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>53</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>54</div></div><div>
</div></div><div><div><div>55</div></div><div><span>        </span><span>// BFS</span></div></div><div><div><div>56</div></div><div><span>        </span><span>while</span><span><span> (visitedCnt </span><span>&lt;</span><span> rows </span><span>*</span><span> cols) {</span></span></div></div><div><div><div>57</div></div><div><span>            </span><span>Block</span><span><span> </span><span>block</span><span> </span></span><span><span>=</span><span> </span></span><span>pq</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>58</div></div><div><span>            </span><span>fill</span><span>(</span><span>block</span><span>.</span><span>row</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>, </span><span>block</span><span>.</span><span>col</span><span>, </span><span>block</span><span>.</span><span>value</span><span>, pq, heightMap);</span></div></div><div><div><div>59</div></div><div><span>            </span><span>fill</span><span>(</span><span>block</span><span>.</span><span>row</span><span>, </span><span>block</span><span>.</span><span>col</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>, </span><span>block</span><span>.</span><span>value</span><span>, pq, heightMap);</span></div></div><div><div><div>60</div></div><div><span>            </span><span>fill</span><span>(</span><span>block</span><span>.</span><span>row</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>, </span><span>block</span><span>.</span><span>col</span><span>, </span><span>block</span><span>.</span><span>value</span><span>, pq, heightMap);</span></div></div><div><div><div>61</div></div><div><span>            </span><span>fill</span><span>(</span><span>block</span><span>.</span><span>row</span><span>, </span><span>block</span><span>.</span><span>col</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>, </span><span>block</span><span>.</span><span>value</span><span>, pq, heightMap);</span></div></div><div><div><div>62</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>63</div></div><div>
</div></div><div><div><div>64</div></div><div><span>        </span><span>return</span><span> water;</span></div></div><div><div><div>65</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>66</div></div><div>
</div></div><div><div><div>67</div></div><div>
</div></div><div><div><div>68</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>fill</span><span>(</span><span>int</span><span><span> </span><span>row</span><span>, </span></span><span>int</span><span><span> </span><span>col</span><span>, </span></span><span>int</span><span><span> </span><span>min</span><span>, </span></span><span>PriorityQueue</span><span>&lt;</span><span>Block</span><span><span>&gt; </span><span>pq</span><span>, </span></span><span>int</span><span><span>[][] </span><span>heightMap</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>69</div></div><div><span>        </span><span>if</span><span><span> (row </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> col </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> row </span><span>&gt;=</span><span> </span></span><span>heightMap</span><span>.</span><span>length</span><span><span> </span><span>||</span><span> col </span><span>&gt;=</span><span> heightMap[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>||</span><span> visited[row][col]) {</span></span></div></div><div><div><div>70</div></div><div><span>            </span><span>// out of bound, or visited block</span></div></div><div><div><div>71</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>72</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (heightMap[row][col] </span><span>&gt;=</span><span> min) {</span></span></div></div><div><div><div>73</div></div><div><span>            </span><span>// visit a higher block, add to queue and mark it as visited</span></div></div><div><div><div>74</div></div><div><span>            </span><span>Block</span><span><span> </span><span>newBlock</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Block</span><span>(row, col, heightMap[row][col]);</span></div></div><div><div><div>75</div></div><div><span>            </span><span>pq</span><span>.</span><span>offer</span><span>(newBlock);</span></div></div><div><div><div>76</div></div><div><span><span>            </span></span><span>visited[row][col] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>77</div></div><div><span><span>            </span></span><span>visitedCnt++;</span></div></div><div><div><div>78</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>79</div></div><div><span>            </span><span>// visit a lower block, add water to be trapped</span></div></div><div><div><div>80</div></div><div><span><span>            </span></span><span>water </span><span>+=</span><span> min </span><span>-</span><span> heightMap[row][col];</span></div></div><div><div><div>81</div></div><div><span><span>            </span></span><span>visited[row][col] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>82</div></div><div><span><span>            </span></span><span>visitedCnt++;</span></div></div><div><div><div>83</div></div><div><span>            </span><span>fill</span><span><span>(row </span><span>-</span><span> </span></span><span>1</span><span>, col, min, pq, heightMap);</span></div></div><div><div><div>84</div></div><div><span>            </span><span>fill</span><span><span>(row, col </span><span>-</span><span> </span></span><span>1</span><span>, min, pq, heightMap);</span></div></div><div><div><div>85</div></div><div><span>            </span><span>fill</span><span><span>(row </span><span>+</span><span> </span></span><span>1</span><span>, col, min, pq, heightMap);</span></div></div><div><div><div>86</div></div><div><span>            </span><span>fill</span><span><span>(row, col </span><span>+</span><span> </span></span><span>1</span><span>, min, pq, heightMap);</span></div></div><div><div><div>87</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>88</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>89</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>408. Valid Word Abbreviation<a href="#408-valid-word-abbreviation"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/valid-word-abbreviation/" target="_blank">https://leetcode.com/problems/valid-word-abbreviation/</a></p><hr /><p>使用两个指针分别遍历<code>word</code>和<code>abbr</code>，如果<code>abbr</code>遇到了数字，判断这个数字<code>number</code>是多少，直到数字结束；否则，让<code>word</code>的指针跳过<code>number</code>的下标，看此时<code>word</code>和<code>abbr</code>下标对应的字母仍然相等。重复这个循环，最后判断两个指针是否能分别完成遍历。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>validWordAbbreviation</span><span>(</span><span>String</span><span><span> </span><span>word</span><span>, </span></span><span>String</span><span><span> </span><span>abbr</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>number</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, j </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> j </span><span>&lt;</span><span> </span></span><span>abbr</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span> (</span><span>abbr</span><span>.</span><span>charAt</span><span><span>(j) </span><span>&gt;=</span><span> </span></span><span>'0'</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>abbr</span><span>.</span><span>charAt</span><span><span>(j) </span><span>&lt;=</span><span> </span></span><span>'9'</span><span>) {</span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>number </span><span>=</span><span> number </span><span>*</span><span> </span><span>10</span><span><span> </span><span>+</span><span> </span></span><span>abbr</span><span>.</span><span>charAt</span><span><span>(j) </span><span>-</span><span> </span></span><span>'0'</span><span>;</span></div></div><div><div><div>9</div></div><div><span>                </span><span>if</span><span><span> (number </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>j++;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>i </span><span>+=</span><span> number;</span></div></div><div><div><div>15</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>&gt;=</span><span> </span></span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>||</span><span> </span></span><span>word</span><span>.</span><span>charAt</span><span><span>(i) </span><span>!=</span><span> </span></span><span>abbr</span><span>.</span><span>charAt</span><span>(j)) {</span></div></div><div><div><div>16</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>number </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>j++;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// abbr ends with number</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>i </span><span>+=</span><span> number;</span></div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span><span> i </span><span>==</span><span> </span></span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> j </span><span>==</span><span> </span></span><span>abbr</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>409. Longest Palindrome<a href="#409-longest-palindrome"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-palindrome/" target="_blank">https://leetcode.com/problems/longest-palindrome/</a></p><hr /><p>统计每个字符出现的次数，用一个变量<code>odd</code>记录出现次数为奇数的字符数量。如果<code>odd</code>最后小于2，说明可以直接用<code>s</code>构造最长的回文串；反之，需要剔除掉<code>odd - 1</code>个这种奇数字符（只能选一个字符全部加入，其他的奇数字符每个要减掉一个）。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>longestPalindrome</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>freq</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>128</span><span>];</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>freq[</span><span>s</span><span>.</span><span>charAt</span><span>(i)]++;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>odd</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>freq</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span><span> (freq[i] </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>odd++;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span><span> odd </span><span>&lt;</span><span> </span></span><span>2</span><span> </span><span>?</span><span> </span><span>s</span><span>.</span><span>length</span><span>() </span><span>:</span><span> </span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> odd </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>410. Split Array Largest Sum<a href="#410-split-array-largest-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/split-array-largest-sum/" target="_blank">https://leetcode.com/problems/split-array-largest-sum/</a></p><hr /><p>如果<code>m</code>和<code>nums</code>的个数相等，那么每个数组都是一个子数组，所以返回<code>nums</code>中最大的数字即可；如果<code>m</code>为1，那么整个<code>nums</code>数组就是一个子数组，返回<code>nums</code>所有数字之和，所以对于其他有效的<code>m</code>值，返回的值必定在上面两个值之间，可以用二分搜索法来做。</p><p>判断和是否满足条件的办法：遍历找到数组的最大值作为初始<code>minVal</code>，数组的和为初始<code>maxVal</code>，选择<code>mid</code>作为二者的平均值。从数组头开始遍历，计算累加和大于等于<code>mid</code>的子数组总量。如果子数组的数量大于<code>m</code>，说明子数组太多了，也就是说区间的和定义的太小了，应该增大<code>minVal</code>的值，因此把<code>minVal</code>设置为<code>mid + 1</code>；相反，则要降低<code>maxVal</code>的值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>splitArray</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>m</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>minVal</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span><span>, maxVal </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>minVal </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(minVal, num);</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>maxVal </span><span>+=</span><span> num;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>while</span><span><span> (minVal </span><span>&lt;</span><span> maxVal) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> minVal </span><span>+</span><span> (maxVal </span><span>-</span><span> minVal) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span> (</span><span>canSplit</span><span>(mid, nums, m)) {</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>maxVal </span><span>=</span><span> mid;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>minVal </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> minVal;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>canSplit</span><span>(</span><span>int</span><span><span> </span><span>upperBoundSubarraySum</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>m</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>23</div></div><div><span>        </span><span>int</span><span><span> </span><span>curSubarraySum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, subarrayCount </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>curSubarraySum </span><span>+=</span><span> num;</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>            </span><span>if</span><span><span> (curSubarraySum </span><span>&gt;</span><span> upperBoundSubarraySum) {</span></span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>subarrayCount++;</span></div></div><div><div><div>30</div></div><div><span><span>                </span></span><span>curSubarraySum </span><span>=</span><span> num;</span></div></div><div><div><div>31</div></div><div><span>                </span><span>if</span><span><span> (subarrayCount </span><span>&gt;</span><span> m) {</span></span></div></div><div><div><div>32</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>411. Minimum Unique Word Abbreviation<a href="#411-minimum-unique-word-abbreviation"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minimum-unique-word-abbreviation/" target="_blank">https://leetcode.com/problems/minimum-unique-word-abbreviation/</a></p><hr /><p>尝试利用位掩码来快速表示不同字符串之间的差别。具体而言，用一个整<code>数diff</code>表示字符串<code>word</code>和<code>target</code>之间的差别，假设要比较它们第i位的字符是否相等，如果不相等，<code>diff</code>就加上<code>1 &lt;&lt; i</code>。解题流程如下：</p><ol>
<li>对于给定的<code>target</code>，在<code>dic</code>中寻找和<code>target</code>长度相同的<code>word</code>，记录下表示<code>word</code>和<code>target</code>之间的差异的<code>diff</code>，用一个Set存起来</li>
<li>如果经过第一步后Set为空，说明不存在缩写冲突的可能，当前字符串直接使用字符串长度作为最短缩写</li>
<li>寻找最大的冲突表示整数<code>bits</code>。具体而言，需要穷举0 ~ <code>1 &lt;&lt; targetLen</code>之间的数与<code>diff</code>进行比较，跳过完全与<code>diff</code>完全不相等的情况，并在剩下的情况中用位运算寻找<code>bits</code></li>
<li>根据最大冲突位数生成最终的缩略字符串。将<code>bits</code>和<code>1 &lt;&lt; i</code>逐位进行对比，如果这当前位相等，说明此时出现冲突，不能用数字缩略，必须将之前的缩略长度添加到缩略字符串后清空，再加上当前位置的字符</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>minAbbreviation</span><span>(</span><span>String</span><span><span> </span><span>target</span><span>, </span></span><span>String</span><span><span>[] </span><span>dic</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>diffs</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>targetLen</span><span> </span></span><span><span>=</span><span> </span></span><span>target</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>word</span><span> </span></span><span>:</span><span> dic) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span> (</span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> targetLen) {</span></span></div></div><div><div><div>8</div></div><div><span>                </span><span>// mark each bit's difference between target and word</span></div></div><div><div><div>9</div></div><div><span>                </span><span>int</span><span><span> </span><span>diff</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> targetLen; i++) {</span></span></div></div><div><div><div>11</div></div><div><span>                    </span><span>if</span><span> (</span><span>target</span><span>.</span><span>charAt</span><span><span>(i) </span><span>!=</span><span> </span></span><span>word</span><span>.</span><span>charAt</span><span>(i))  {</span></div></div><div><div><div>12</div></div><div><span><span>                        </span></span><span>diff </span><span>+=</span><span> </span><span>1</span><span><span> </span><span>&lt;&lt;</span><span> i;</span></span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>                </span><span>diffs</span><span>.</span><span>add</span><span>(diff);</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// all words have different length, then return the shortest abbr</span></div></div><div><div><div>21</div></div><div><span>        </span><span>if</span><span> (</span><span>diffs</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span> </span><span>Integer</span><span>.</span><span>toString</span><span>(targetLen);</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>int</span><span><span> </span><span>bits</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>;</span></div></div><div><div><div>26</div></div><div><span>        </span><span>int</span><span><span> </span><span>max</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>;</span></div></div><div><div><div>27</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> (</span></span><span>1</span><span><span> </span><span>&lt;&lt;</span><span> targetLen); i++) {</span></span></div></div><div><div><div>28</div></div><div><span>            </span><span>boolean</span><span><span> </span><span>flag</span><span> </span></span><span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>// skip cases that are totally different from dic</span></div></div><div><div><div>31</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>diff</span><span> </span></span><span>:</span><span> diffs) {</span></div></div><div><div><div>32</div></div><div><span>                </span><span>if</span><span><span> ((i </span><span>&amp;</span><span> diff) </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>                    </span></span><span>flag </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>34</div></div><div><span>                    </span><span>break</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>            </span><span>// get maximum conflicting bits</span></div></div><div><div><div>39</div></div><div><span>            </span><span>if</span><span> (flag) {</span></div></div><div><div><div>40</div></div><div><span>                </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>41</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> targetLen </span><span>-</span><span> </span></span><span>1</span><span>; j++) {</span></div></div><div><div><div>42</div></div><div><span>                    </span><span>if</span><span><span> (((i </span><span>&gt;&gt;</span><span> j) </span><span>&amp;</span><span> </span></span><span>3</span><span><span>) </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>43</div></div><div><span><span>                        </span></span><span>sum++;</span></div></div><div><div><div>44</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>                </span><span>if</span><span><span> (sum </span><span>&gt;</span><span> max) {</span></span></div></div><div><div><div>48</div></div><div><span><span>                    </span></span><span>max </span><span>=</span><span> sum;</span></div></div><div><div><div>49</div></div><div><span><span>                    </span></span><span>bits </span><span>=</span><span> i;</span></div></div><div><div><div>50</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>52</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>55</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>56</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> targetLen; i++) {</span></span></div></div><div><div><div>57</div></div><div>
</div></div><div><div><div>58</div></div><div><span>            </span><span>// current pos cannot be replaced with an abbr digit, must use alphabet instead</span></div></div><div><div><div>59</div></div><div><span>            </span><span>if</span><span><span> ((bits </span><span>&amp;</span><span> (</span></span><span>1</span><span><span> </span><span>&lt;&lt;</span><span> i)) </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>60</div></div><div><span>                </span><span>if</span><span><span> (count </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>61</div></div><div><span>                    </span><span>result</span><span>.</span><span>append</span><span>(count);</span></div></div><div><div><div>62</div></div><div><span><span>                    </span></span><span>count </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>63</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>64</div></div><div><span>                </span><span>result</span><span>.</span><span>append</span><span>(</span><span>target</span><span>.</span><span>charAt</span><span>(i));</span></div></div><div><div><div>65</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>66</div></div><div><span><span>                </span></span><span>count++;</span></div></div><div><div><div>67</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>68</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>69</div></div><div>
</div></div><div><div><div>70</div></div><div><span>        </span><span>if</span><span><span> (count </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>71</div></div><div><span>            </span><span>result</span><span>.</span><span>append</span><span>(count);</span></div></div><div><div><div>72</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>73</div></div><div><span>        </span><span>return</span><span> </span><span>result</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>74</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>75</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>412. Fizz Buzz<a href="#412-fizz-buzz"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/fizz-buzz/" target="_blank">https://leetcode.com/problems/fizz-buzz/</a></p><hr /><p>直接使用常规循环判断法解题即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>fizzBuzz</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>5</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>%</span><span> </span></span><span>3</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> i </span><span>%</span><span> </span></span><span>5</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(</span><span>"FizzBuzz"</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (i </span><span>%</span><span> </span></span><span>3</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>8</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(</span><span>"Fizz"</span><span>);</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (i </span><span>%</span><span> </span></span><span>5</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(</span><span>"Buzz"</span><span>);</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>12</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(</span><span>String</span><span>.</span><span>valueOf</span><span>(i));</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>如果想让代码更加优雅，并且在未来具有良好的拓展性，可以设计一个TreeMap，存放所有的编码规则，在循环遍历时直接去Map中找当前数字所有匹配的规则。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>fizzBuzz</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// define the order of how you want to concat the words here using lambda comparator</span></div></div><div><div><div>4</div></div><div><span>        </span><span>TreeMap</span><span>&lt;</span><span>Integer</span><span>, </span><span>String</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeMap</span><span>&lt;&gt;((a, b) </span><span>-&gt;</span><span><span> a </span><span>-</span><span> b);</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(</span><span>3</span><span>, </span><span>"Fizz"</span><span>);</span></div></div><div><div><div>6</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(</span><span>5</span><span>, </span><span>"Buzz"</span><span>);</span></div></div><div><div><div>7</div></div><div><span>        </span><span>// map.put(7, "Yuzz");</span></div></div><div><div><div>8</div></div><div><span>        </span><span>// map.put(9, "Mozz");</span></div></div><div><div><div>9</div></div><div><span>        </span><span>// add more encoding options here ...</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>();</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>StringBuilder</span><span><span> </span><span>encoded</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>14</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> </span><span>map</span><span>.</span><span>keySet</span><span>()) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>%</span><span> num </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>                    </span><span>encoded</span><span>.</span><span>append</span><span>(</span><span>map</span><span>.</span><span>get</span><span>(num));</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>((</span><span>encoded</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) </span><span>?</span><span> </span><span>String</span><span>.</span><span>valueOf</span><span>(i) </span><span>:</span><span> </span><span>encoded</span><span>.</span><span>toString</span><span>());</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>413. Arithmetic Slices<a href="#413-arithmetic-slices"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/arithmetic-slices/" target="_blank">https://leetcode.com/problems/arithmetic-slices/</a></p><hr /><p>循环遍历数组，只需要跟踪当前下标数与之前的两个数，判断这三个数能不能成为一组新的slice。如果可以，当前<code>newSlice</code>数量加1，并且注意实时更新结果数量时，要添加的是目前的<code>newSlice</code>数量而不是1（因为当前<code>newSlice</code>每加一，就代表前面已有的slice都可以再拓展一位当前数，组成一个新的slice）。而一旦三个数中断组成slice，<code>newSlice</code>全要被清零。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>numberOfArithmeticSlices</span><span>(</span><span>int</span><span><span>[] </span><span>A</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>newSlice</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, result </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>2</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>A</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>if</span><span> (</span><span>A</span><span><span>[i</span><span>-</span></span><span>1</span><span><span>] </span><span>-</span><span> </span></span><span>A</span><span><span>[i</span><span>-</span></span><span>2</span><span><span>] </span><span>==</span><span> </span></span><span>A</span><span><span>[i] </span><span>-</span><span> </span></span><span>A</span><span><span>[i</span><span>-</span></span><span>1</span><span>]) {</span></div></div><div><div><div>7</div></div><div><span><span>                </span></span><span>newSlice++;</span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> newSlice;</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>newSlice </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>414. Third Maximum Number<a href="#414-third-maximum-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/third-maximum-number/" target="_blank">https://leetcode.com/problems/third-maximum-number/</a></p><hr /><p>使用三变量法进行统计，注意变量初始化时声明为null更加严谨。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>thirdMax</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Integer</span><span><span> </span><span>max1</span><span> </span></span><span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Integer</span><span><span> </span><span>max2</span><span> </span></span><span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>Integer</span><span><span> </span><span>max3</span><span> </span></span><span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>Integer</span><span><span> </span><span>n</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span> (</span><span>n</span><span>.</span><span>equals</span><span><span>(max1) </span><span>||</span><span> </span></span><span>n</span><span>.</span><span>equals</span><span><span>(max2) </span><span>||</span><span> </span></span><span>n</span><span>.</span><span>equals</span><span>(max3)) {</span></div></div><div><div><div>9</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (max1 </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> n </span><span>&gt;</span><span> max1) {</span></span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>max3 </span><span>=</span><span> max2;</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>max2 </span><span>=</span><span> max1;</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>max1 </span><span>=</span><span> n;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (max2 </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> n </span><span>&gt;</span><span> max2) {</span></span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>max3 </span><span>=</span><span> max2;</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>max2 </span><span>=</span><span> n;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (max3 </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> n </span><span>&gt;</span><span> max3) {</span></span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>max3 </span><span>=</span><span> n;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span><span> max3 </span><span>==</span><span> </span></span><span>null</span><span> </span><span>?</span><span> max1 </span><span>:</span><span> max3;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>如果要拓展成更加一般性的第<code>k</code>大数字，可以使用优先队列+集合。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>thirdMax</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>PriorityQueue</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>pq</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>set</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>n</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span> (</span><span>set</span><span>.</span><span>add</span><span>(n)) {</span></div></div><div><div><div>8</div></div><div><span>                </span><span>pq</span><span>.</span><span>offer</span><span>(n);</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>                </span><span>if</span><span> (</span><span>pq</span><span>.</span><span>size</span><span><span>() </span><span>&gt;</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>                    </span><span>pq</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span> (</span><span>pq</span><span>.</span><span>size</span><span><span>() </span><span>==</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>pq</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> </span><span>pq</span><span>.</span><span>peek</span><span>();</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>415. Add Strings<a href="#415-add-strings"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/add-strings/" target="_blank">https://leetcode.com/problems/add-strings/</a></p><hr /><p>仍然是模拟加法，从字符串尾部开始，取数 -&gt; 做加法 -&gt; 得到进位，循环直到两个数都完整被遍历过一次。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>addStrings</span><span>(</span><span>String</span><span><span> </span><span>num1</span><span>, </span></span><span>String</span><span><span> </span><span>num2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>carry</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>len1</span><span> </span></span><span><span>=</span><span> </span></span><span>num1</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>len2</span><span> </span></span><span><span>=</span><span> </span></span><span>num2</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>while</span><span><span> (len1 </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> len2 </span><span>&gt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> len1 </span><span>&gt;=</span><span> </span></span><span>0</span><span> </span><span>?</span><span> </span><span>num1</span><span>.</span><span>charAt</span><span><span>(len1) </span><span>-</span><span> </span></span><span>'0'</span><span> </span><span>:</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div><span>            </span><span>int</span><span><span> </span><span>y</span><span> </span></span><span><span>=</span><span> len2 </span><span>&gt;=</span><span> </span></span><span>0</span><span> </span><span>?</span><span> </span><span>num2</span><span>.</span><span>charAt</span><span><span>(len2) </span><span>-</span><span> </span></span><span>'0'</span><span> </span><span>:</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div><span>            </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> (x </span><span>+</span><span> y </span><span>+</span><span> carry) </span><span>%</span><span> </span></span><span>10</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>carry </span><span>=</span><span> (x </span><span>+</span><span> y </span><span>+</span><span> carry) </span><span>/</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>13</div></div><div><span>            </span><span>result</span><span>.</span><span>append</span><span>(sum);</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>len1--;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>len2--;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (carry </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>result</span><span>.</span><span>append</span><span>(carry);</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> </span><span>result</span><span>.</span><span>reverse</span><span>().</span><span>toString</span><span>();</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>416. Partition Equal Subset Sum<a href="#416-partition-equal-subset-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/partition-equal-subset-sum/" target="_blank">https://leetcode.com/problems/partition-equal-subset-sum/</a></p><hr /><p>使用DFS，把问题转化成选若干个数，使得总和恰好为<code>sum</code>的一半。注意考虑两种情况：</p><ul>
<li>选择当前数字，并修改下一次递归的<code>target</code></li>
<li>不选择当前数字，而是找到下一个不同的数字并选择它进行递归</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>canPartition</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>val</span></span><span>:</span><span><span> nums) sum </span><span>+=</span><span> val;</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>if</span><span><span> (sum </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>sum </span><span>/=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>Boolean</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Boolean</span><span><span>[sum </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>boolean</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>canPartition</span><span>(sum, </span><span>0</span><span>, nums, dp);</span></div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>canPartition</span><span>(</span><span>int</span><span><span> </span><span>sum</span><span>, </span></span><span>int</span><span><span> </span><span>pos</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>Boolean</span><span><span>[] </span><span>dp</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>17</div></div><div><span>        </span><span>if</span><span><span> (sum </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span><span> (sum </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> pos </span><span>==</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span><span> (dp[sum] </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>return</span><span> dp[sum];</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>dp[sum] </span><span>=</span><span> </span><span>canPartition</span><span><span>(sum </span><span>-</span><span> nums[pos], pos </span><span>+</span><span> </span></span><span>1</span><span><span>, nums, dp) </span><span>||</span><span> </span></span><span>canPartition</span><span><span>(sum, pos </span><span>+</span><span> </span></span><span>1</span><span>, nums, dp);</span></div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> dp[sum];</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>417. Pacific Atlantic Water Flow<a href="#417-pacific-atlantic-water-flow"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/pacific-atlantic-water-flow/" target="_blank">https://leetcode.com/problems/pacific-atlantic-water-flow/</a></p><hr /><p>使用DFS逆向推导，因为边缘的格子一定能够进入海洋。逆向推导的过程中，用两个二维数组分别表示当前的坐标是否能进入太平洋/大西洋。注意，因为两个海洋对应四条边，因此需要以四条边的每个点做为起点进行DFS。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>pacificAtlantic</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span> (</span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>boolean</span><span><span>[][] </span><span>pacific</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span>[m][n];</span></div></div><div><div><div>11</div></div><div><span>        </span><span>boolean</span><span><span>[][] </span><span>atlantic</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span>[m][n];</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// top and bottom</span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>col</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; col </span><span>&lt;</span><span> n; col++) {</span></span></div></div><div><div><div>15</div></div><div><span>            </span><span>dfs</span><span>(matrix, </span><span>0</span><span>, col, matrix[</span><span>0</span><span>][col], pacific);</span></div></div><div><div><div>16</div></div><div><span>            </span><span>dfs</span><span><span>(matrix, m</span><span>-</span></span><span>1</span><span><span>, col, matrix[m</span><span>-</span></span><span>1</span><span>][col], atlantic);</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>// left and right</span></div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; row </span><span>&lt;</span><span> m; row++) {</span></span></div></div><div><div><div>21</div></div><div><span>            </span><span>dfs</span><span>(matrix, row, </span><span>0</span><span>, matrix[row][</span><span>0</span><span>], pacific);</span></div></div><div><div><div>22</div></div><div><span>            </span><span>dfs</span><span><span>(matrix, row, n</span><span>-</span></span><span>1</span><span><span>, matrix[row][n</span><span>-</span></span><span>1</span><span>], atlantic);</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>// find all grids that meet requirements</span></div></div><div><div><div>26</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> m; i++) {</span></span></div></div><div><div><div>27</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> n; j++) {</span></span></div></div><div><div><div>28</div></div><div><span>                </span><span>if</span><span><span> (pacific[i][j] </span><span>&amp;&amp;</span><span> atlantic[i][j]) {</span></span></div></div><div><div><div>29</div></div><div><span>                    </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>temp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>();</span></div></div><div><div><div>30</div></div><div><span>                    </span><span>temp</span><span>.</span><span>add</span><span>(i);</span></div></div><div><div><div>31</div></div><div><span>                    </span><span>temp</span><span>.</span><span>add</span><span>(j);</span></div></div><div><div><div>32</div></div><div><span>                    </span><span>result</span><span>.</span><span>add</span><span>(temp);</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>, </span></span><span>int</span><span><span> </span><span>r</span><span>, </span></span><span>int</span><span><span> </span><span>c</span><span>, </span></span><span>int</span><span><span> </span><span>preHeight</span><span>, </span></span><span>boolean</span><span><span>[][] </span><span>ocean</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>41</div></div><div><span>        </span><span>// skip out-of-bound &amp; higher flow &amp; visited cases</span></div></div><div><div><div>42</div></div><div><span>        </span><span>if</span><span><span> (r </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> c </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> r </span><span>&gt;</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span>-</span><span>1</span><span><span> </span><span>||</span><span> c </span><span>&gt;</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span>-</span><span>1</span><span><span> </span><span>||</span><span> matrix[r][c] </span><span>&lt;</span><span> preHeight </span><span>||</span><span> ocean[r][c]) {</span></span></div></div><div><div><div>43</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>ocean[r][c] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>47</div></div><div><span>        </span><span>dfs</span><span><span>(matrix, r </span><span>-</span><span> </span></span><span>1</span><span>, c, matrix[r][c], ocean); </span><span>// up</span></div></div><div><div><div>48</div></div><div><span>        </span><span>dfs</span><span><span>(matrix, r </span><span>+</span><span> </span></span><span>1</span><span>, c, matrix[r][c], ocean); </span><span>// down</span></div></div><div><div><div>49</div></div><div><span>        </span><span>dfs</span><span><span>(matrix, r, c </span><span>-</span><span> </span></span><span>1</span><span>, matrix[r][c], ocean); </span><span>// left</span></div></div><div><div><div>50</div></div><div><span>        </span><span>dfs</span><span><span>(matrix, r, c </span><span>+</span><span> </span></span><span>1</span><span>, matrix[r][c], ocean); </span><span>// right</span></div></div><div><div><div>51</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>52</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>418. Sentence Screen Fitting<a href="#418-sentence-screen-fitting"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sentence-screen-fitting/" target="_blank">https://leetcode.com/problems/sentence-screen-fitting/</a></p><hr /><p>使用数组<code>times</code>记录每一行完成遍历的次数；使用数组<code>nextIndex</code>记录下一行的起始单词对应下标。</p><p>中间的循环，本质是遍历单词填满每一行长度的过程，如果填满了就保存下一行的起始下标与这一行的次数，之后跳下一行；如果这一行完成了遍历，还要更新遍历次数。最后，根据<code>rows</code>的长度，顺序累加遍历次数即可，检查完一行需要根据下一行起始下标进行跳转。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>wordsTyping</span><span>(</span><span>String</span><span><span>[] </span><span>sentence</span><span>, </span></span><span>int</span><span><span> </span><span>rows</span><span>, </span></span><span>int</span><span><span> </span><span>cols</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// a new line which is starting with certain index in sentence, what is the starting index of next line</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>nextIndex</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>sentence</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// how many times the pointer in current line passes over the last index</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>times</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>sentence</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>sentence</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>int</span><span><span> </span><span>curLen</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div><span>            </span><span>int</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> i;</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>int</span><span><span> </span><span>time</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>            </span><span>while</span><span><span> (curLen </span><span>+</span><span> sentence[cur].</span></span><span>length</span><span><span>() </span><span>&lt;=</span><span> cols) {</span></span></div></div><div><div><div>15</div></div><div><span>                </span><span>// word + space</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>curLen </span><span>+=</span><span> sentence[cur].</span><span>length</span><span><span>() </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>cur++;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>                </span><span>// the whole sentence is added for a time</span></div></div><div><div><div>20</div></div><div><span>                </span><span>if</span><span><span> (cur </span><span>==</span><span> </span></span><span>sentence</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>21</div></div><div><span><span>                    </span></span><span>cur </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>                    </span></span><span>time++;</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>            </span><span>// stop at the first word of next line and times of the previous line</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>nextIndex[i] </span><span>=</span><span> cur;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>times[i] </span><span>=</span><span> time;</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>32</div></div><div><span>        </span><span>int</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// start from the first word in the sentence</span></div></div><div><div><div>33</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> rows; i++) {</span></span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> times[cur];</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> nextIndex[cur]; </span><span>// update start of next row</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>419. Battleships in a Board<a href="#419-battleships-in-a-board"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/battleships-in-a-board/" target="_blank">https://leetcode.com/problems/battleships-in-a-board/</a></p><hr /><p>因为战舰的构造一定是<code>1*N</code>或者<code>N*1</code>，因此不需要搜索，直接两重循环遍历，检查当前方格是否处在一行或一列’X’中，具体而言只需要循环和左、上邻近方格比较即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>countBattleships</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>board</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> board[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>board</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> board[</span></span><span>0</span><span>].</span><span>length</span><span>; j++) {</span></div></div><div><div><div>10</div></div><div><span>                </span><span>if</span><span><span> (board[i][j] </span><span>==</span><span> </span></span><span>'.'</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>                    </span><span>continue</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>                </span><span>// 1 x N or N x 1, thus we can always check left or up grid to determine the same battleship</span></div></div><div><div><div>15</div></div><div><span>                </span><span>if</span><span><span> ((i </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> board[i</span><span>-</span></span><span>1</span><span><span>][j] </span><span>==</span><span> </span></span><span>'X'</span><span><span>) </span><span>||</span><span> (j </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> board[i][j</span><span>-</span></span><span>1</span><span><span>] </span><span>==</span><span> </span></span><span>'X'</span><span>)) {</span></div></div><div><div><div>16</div></div><div><span>                    </span><span>continue</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>result++;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>420. Strong Password Checker<a href="#420-strong-password-checker"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/strong-password-checker/" target="_blank">https://leetcode.com/problems/strong-password-checker/</a></p><hr /><p>记录下缺失的字符类型数量（小写、大写、数字），再用一个数组记录字符串截止到每一位时的重复字符数量。</p><ul>
<li>如果字符串太短，检查是否需要补缺失的字符，再看剩下的长度是否达到至少6位</li>
<li>删减重复子字符串，根据每位重复字符数量，把大于2的情况删减修改成2</li>
<li>如果字符串很长，就先做删减重复子字符串，看删完之后剩下的长度是否还超过20位，并视需要补缺失字符</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>strongPasswordChecker</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// number of missing lowercase letters, uppercase letters and digits</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>a</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>, A </span><span>=</span><span> </span></span><span>1</span><span><span>, d </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// number of repeating characters starting at the corresponding position in the string</span></div></div><div><div><div>9</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>carr</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>arr</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>carr</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span>;) {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>char</span><span><span> </span><span>currentChar</span><span> </span></span><span><span>=</span><span> carr[i];</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span> (</span><span>Character</span><span>.</span><span>isLowerCase</span><span><span>(currentChar)) a </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span> (</span><span>Character</span><span>.</span><span>isUpperCase</span><span><span>(currentChar)) A </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>16</div></div><div><span>            </span><span>if</span><span> (</span><span>Character</span><span>.</span><span>isDigit</span><span><span>(currentChar)) d </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>            </span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i;</span></span></div></div><div><div><div>19</div></div><div><span>            </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>carr</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> carr[i] </span><span>==</span><span> carr[j]) {</span></span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>arr[j] </span><span>=</span><span> i </span><span>-</span><span> j;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>int</span><span><span> </span><span>totalMissing</span><span> </span></span><span><span>=</span><span> (a </span><span>+</span><span> A </span><span>+</span><span> d);</span></span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>// pad length to at least 6</span></div></div><div><div><div>28</div></div><div><span>        </span><span>if</span><span> (</span><span>arr</span><span>.</span><span>length</span><span><span> </span><span>&lt;</span><span> </span></span><span>6</span><span>) {</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> totalMissing </span><span>+</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(</span><span>0</span><span>, </span><span>6</span><span><span> </span><span>-</span><span> (</span></span><span>arr</span><span>.</span><span>length</span><span><span> </span><span>+</span><span> totalMissing));</span></span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>31</div></div><div><span>            </span><span>int</span><span><span> </span><span>overLenCharNum</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span>(</span><span>arr</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>20</span><span>, </span><span>0</span><span><span>), leftOverNum </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> overLenCharNum;</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; k </span><span>&lt;</span><span> </span></span><span>3</span><span>; k++) {</span></div></div><div><div><div>35</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> overLenCharNum </span><span>&gt;</span><span> </span></span><span>0</span><span>; i++) {</span></div></div><div><div><div>36</div></div><div><span>                    </span><span>if</span><span><span> (arr[i] </span><span>&lt;</span><span> </span></span><span>3</span><span><span> </span><span>||</span><span> arr[i] </span><span>%</span><span> </span></span><span>3</span><span><span> </span><span>!=</span><span> (k </span><span>-</span><span> </span></span><span>1</span><span>)) {</span></div></div><div><div><div>37</div></div><div><span>                        </span><span>continue</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>                    </span><span>// turn all numbers in the arr array greater than 2 into the form of (3m + 2)</span></div></div><div><div><div>41</div></div><div><span><span>                    </span></span><span>arr[i] </span><span>-=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(overLenCharNum, k);</span></div></div><div><div><div>42</div></div><div><span><span>                    </span></span><span>overLenCharNum </span><span>-=</span><span> k;</span></div></div><div><div><div>43</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>47</div></div><div><span>                </span><span>if</span><span><span> (arr[i] </span><span>&gt;=</span><span> </span></span><span>3</span><span><span> </span><span>&amp;&amp;</span><span> overLenCharNum </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>48</div></div><div><span>                    </span><span>// minimum number of changes needed to fix the repeating character problem by deletion only</span></div></div><div><div><div>49</div></div><div><span>                    </span><span>int</span><span><span> </span><span>need</span><span> </span></span><span><span>=</span><span> arr[i] </span><span>-</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>50</div></div><div><span><span>                    </span></span><span>arr[i] </span><span>-=</span><span> overLenCharNum;</span></div></div><div><div><div>51</div></div><div><span><span>                    </span></span><span>overLenCharNum </span><span>-=</span><span> need;</span></div></div><div><div><div>52</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span>                </span><span>if</span><span><span> (arr[i] </span><span>&gt;=</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>55</div></div><div><span><span>                    </span></span><span>leftOverNum </span><span>+=</span><span> arr[i] </span><span>/</span><span> </span><span>3</span><span>;</span></div></div><div><div><div>56</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>57</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(totalMissing, leftOverNum);</span></div></div><div><div><div>60</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>61</div></div><div>
</div></div><div><div><div>62</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>63</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>64</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>421. Maximum XOR of Two Numbers in an Array<a href="#421-maximum-xor-of-two-numbers-in-an-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/" target="_blank">https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/</a></p><hr /><p>使用循环，设定前<code>i</code>位为可能的最大异或值，之后从set中寻找能匹配的记录。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findMaximumXOR</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>max</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, mask </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// find max number to get max length</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>maxNum</span><span> </span></span><span><span>=</span><span> nums[</span></span><span>0</span><span>];</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>maxNum </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(maxNum, nums[i]);</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>toBinaryString</span><span>(maxNum).</span><span>length</span><span>();</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> len </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>// The mask will grow like  100..000 , 110..000, 111..000,  then 1111...111</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>mask </span><span>=</span><span> mask </span><span>|</span><span> (</span><span>1</span><span><span> </span><span>&lt;&lt;</span><span> i);</span></span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>HashSet</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>set</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>// only care about the left parts</span></div></div><div><div><div>20</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>21</div></div><div><span>                </span><span>set</span><span>.</span><span>add</span><span><span>(num </span><span>&amp;</span><span> mask);</span></span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>            </span><span>// try to find a candidate which can give the greediest try;</span></div></div><div><div><div>25</div></div><div><span>            </span><span>int</span><span><span> </span><span>tmp</span><span> </span></span><span><span>=</span><span> max </span><span>|</span><span> (</span></span><span>1</span><span><span> </span><span>&lt;&lt;</span><span> i);</span></span></div></div><div><div><div>26</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>prefix</span><span> </span></span><span>:</span><span> set) {</span></div></div><div><div><div>27</div></div><div><span>                </span><span>// if a ^ b = c, then a ^ c = b</span></div></div><div><div><div>28</div></div><div><span>                </span><span>// to get b, we need a ^ c, if a ^ c exisited in our set, then we're good to go</span></div></div><div><div><div>29</div></div><div><span>                </span><span>if</span><span> (</span><span>set</span><span>.</span><span>contains</span><span><span>(tmp </span><span>^</span><span> prefix)) {</span></span></div></div><div><div><div>30</div></div><div><span><span>                    </span></span><span>max </span><span>=</span><span> tmp;</span></div></div><div><div><div>31</div></div><div><span>                    </span><span>break</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>return</span><span> max;</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>422. Valid Word Square<a href="#422-valid-word-square"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/valid-word-square/" target="_blank">https://leetcode.com/problems/valid-word-square/</a></p><hr /><p>把<code>words</code>中每个<code>word</code>提取出来，拷贝到二维数组<code>matrix</code>中，之后直接在<code>matrix</code>根据对角线镜像对称判断是否合法。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>validWordSquare</span><span>(</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>words</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (words </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>words</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>words</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>7</div></div><div><span>        </span><span>char</span><span><span>[][] </span><span>matrix</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[m][m];</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> m; i++) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>String</span><span><span> </span><span>word</span><span> </span></span><span><span>=</span><span> </span></span><span>words</span><span>.</span><span>get</span><span>(i);</span></div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span> (</span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> m) {</span></span></div></div><div><div><div>12</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>            </span><span>System</span><span>.</span><span>arraycopy</span><span>(</span><span>word</span><span>.</span><span>toCharArray</span><span>(), </span><span>0</span><span>, matrix[i], </span><span>0</span><span>, </span><span>word</span><span>.</span><span>length</span><span>());</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; row </span><span>&lt;</span><span> m; row++) {</span></span></div></div><div><div><div>18</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>col</span><span> </span></span><span><span>=</span><span> row; col </span><span>&lt;</span><span> m; col++) {</span></span></div></div><div><div><div>19</div></div><div><span>                </span><span>if</span><span><span> (matrix[row][col] </span><span>!=</span><span> matrix[col][row]) {</span></span></div></div><div><div><div>20</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>423. Reconstruct Original Digits from English<a href="#423-reconstruct-original-digits-from-english"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reconstruct-original-digits-from-english/" target="_blank">https://leetcode.com/problems/reconstruct-original-digits-from-english/</a></p><hr /><p>所有偶数英文单词都有一个独有的字母；而奇数的单词中虽然没有独有字母，但可以通过排除掉偶数之后得到唯一的情况。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>originalDigits</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// hashmap, map letter into its frequency</span></div></div><div><div><div>4</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[</span><span>26</span><span><span> </span><span>+</span><span> (</span></span><span>int</span><span>)</span><span>'a'</span><span>];</span></div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>letter</span></span><span>:</span><span> </span><span>s</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>count[letter]++;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// map array, map digit into its frequency</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>out</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>10</span><span>];</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// letter "z" only in "zero"</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>out[</span><span>0</span><span><span>] </span><span>=</span><span> count[</span></span><span>'z'</span><span>];</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// letter "w" only in "two"</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>out[</span><span>2</span><span><span>] </span><span>=</span><span> count[</span></span><span>'w'</span><span>];</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>// letter "u" only in "four"</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>out[</span><span>4</span><span><span>] </span><span>=</span><span> count[</span></span><span>'u'</span><span>];</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>// letter "x" only in "six"</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>out[</span><span>6</span><span><span>] </span><span>=</span><span> count[</span></span><span>'x'</span><span>];</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// letter "g" only in "eight"</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>out[</span><span>8</span><span><span>] </span><span>=</span><span> count[</span></span><span>'g'</span><span>];</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>// letter "h" only in "three" and "eight"</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>out[</span><span>3</span><span><span>] </span><span>=</span><span> count[</span></span><span>'h'</span><span><span>] </span><span>-</span><span> out[</span></span><span>8</span><span>];</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// letter "f" only in "five" and "four"</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>out[</span><span>5</span><span><span>] </span><span>=</span><span> count[</span></span><span>'f'</span><span><span>] </span><span>-</span><span> out[</span></span><span>4</span><span>];</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>// letter "s" only in "seven" and "six"</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>out[</span><span>7</span><span><span>] </span><span>=</span><span> count[</span></span><span>'s'</span><span><span>] </span><span>-</span><span> out[</span></span><span>6</span><span>];</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>// letter "i" is in "nine", "five", "six", and "eight"</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>out[</span><span>9</span><span><span>] </span><span>=</span><span> count[</span></span><span>'i'</span><span><span>] </span><span>-</span><span> out[</span></span><span>5</span><span><span>] </span><span>-</span><span> out[</span></span><span>6</span><span><span>] </span><span>-</span><span> out[</span></span><span>8</span><span>];</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>// letter "n" is in "one", "nine", and "seven"</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>out[</span><span>1</span><span><span>] </span><span>=</span><span> count[</span></span><span>'n'</span><span><span>] </span><span>-</span><span> out[</span></span><span>7</span><span><span>] </span><span>-</span><span> </span></span><span>2</span><span><span> </span><span>*</span><span> out[</span></span><span>9</span><span>];</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>43</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>10</span><span>; i++) {</span></div></div><div><div><div>44</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> out[i]; j++) {</span></span></div></div><div><div><div>45</div></div><div><span>                </span><span>result</span><span>.</span><span>append</span><span>(i);</span></div></div><div><div><div>46</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span>        </span><span>return</span><span> </span><span>result</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>49</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>424. Longest Repeating Character Replacement<a href="#424-longest-repeating-character-replacement"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-repeating-character-replacement/" target="_blank">https://leetcode.com/problems/longest-repeating-character-replacement/</a></p><hr /><p>使用滑动窗口，用一个变量<code>maxCount</code>记录当前窗口中出现次数最多的单个字符数量。因为最多只能进行<code>k</code>次替换，因此必须保证当前窗口内的其他字符不能超过<code>k</code>个，否则就必须从窗口头部删去字符。每完成一次窗口的更新，就更新当前窗口的最大长度。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>characterReplacement</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>maxCount</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// largest count of a single, unique character in the current window</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>maxLength</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>freq</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>chars</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>start</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, end </span><span>=</span><span> </span></span><span>0</span><span><span>; end </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); end++) {</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>maxCount </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(maxCount, ++freq[chars[end] </span><span>-</span><span> </span></span><span>'A'</span><span>]);</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>            </span><span>// at most k replacements in the window, and there are more characters in the window than we can replace</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (end </span><span>-</span><span> start </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>-</span><span> maxCount </span><span>&gt;</span><span> k) {</span></span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>freq[chars[start] </span><span>-</span><span> </span><span>'A'</span><span>]--;</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>start++;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>maxLength </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(maxLength, end </span><span>-</span><span> start </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> maxLength;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>425. Word Squares<a href="#425-word-squares"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/word-squares/" target="_blank">https://leetcode.com/problems/word-squares/</a></p><hr /><p>构造<code>Trie</code>，把输入的词都添加到<code>TrieNode</code>中，再构建一个<code>len*len</code>大小的char map用于DFS检查。注意DFS开始时传入的参数是一个<code>TrieNode</code>的数组<code>tns</code>，表示一共组建了<code>n</code>个Trie，<code>tns[i]</code>在DFS中表示对于<code>word[i]</code>，下一个可用的字母。每一层DFS中都新开一个数组，拷贝符合的字母树路径。遍历当前的<code>candidate</code>字符串时，根据对称性修改二维char map的值进行匹配比较。如果纵向每个字母都能匹配就开始下一层递归，直到<code>len</code>层长度都匹配完成。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>class</span><span><span> </span><span>TrieNode</span><span> </span></span><span>{</span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> list</span></span><span><span>;</span><span> </span></span><span>// all words that have this node as prefix</span></div></div><div><div><div>4</div></div><div><span>        </span><span>TrieNode</span><span>[] children</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>TrieNode</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>list </span><span>=</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>children </span><span>=</span><span> </span><span>new</span><span> </span><span>TrieNode</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span>// O(n^len) * len</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt;</span><span> </span></span><span>wordSquares</span><span>(</span><span>String</span><span><span>[] </span><span>words</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>TrieNode</span><span><span> </span><span>root</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span>();</span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>w</span><span> </span></span><span>:</span><span> words) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>root</span><span>.</span><span>list</span><span>.</span><span>add</span><span>(w);</span></div></div><div><div><div>16</div></div><div><span>            </span><span>TrieNode</span><span><span> </span><span>tn</span><span> </span></span><span><span>=</span><span> root;</span></span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>            </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>ch</span><span> </span></span><span>:</span><span> </span><span>w</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>if</span><span> (</span><span>tn</span><span>.</span><span>children</span><span><span>[ch </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>20</div></div><div><span>                    </span><span>tn</span><span>.</span><span>children</span><span><span>[ch </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span>();</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>tn </span><span>=</span><span> </span><span>tn</span><span>.</span><span>children</span><span><span>[ch </span><span>-</span><span> </span></span><span>'a'</span><span>];</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>                </span><span>// add word to each node in the tree</span></div></div><div><div><div>25</div></div><div><span>                </span><span>tn</span><span>.</span><span>list</span><span>.</span><span>add</span><span>(w);</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// length of square</span></div></div><div><div><div>30</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> words[</span></span><span>0</span><span>].</span><span>length</span><span>();</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>// form n tries starting from root, one trie for each word</span></div></div><div><div><div>33</div></div><div><span>        </span><span>// tns[i] tells us in the DFS, for word[i], which letter is available next</span></div></div><div><div><div>34</div></div><div><span>        </span><span>TrieNode</span><span><span>[] </span><span>tns</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span>[len];</span></div></div><div><div><div>35</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span>(tns, root);</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>38</div></div><div><span>        </span><span>dfs</span><span>(</span><span>0</span><span>, </span><span>new</span><span> </span><span>char</span><span>[len][len], result, tns);</span></div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span> </span><span>idx</span><span>, </span></span><span>char</span><span><span>[][] </span><span>m</span><span>, </span></span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>TrieNode</span><span><span>[] </span><span>tns</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>43</div></div><div><span>        </span><span>// one word square, add all the strings to result</span></div></div><div><div><div>44</div></div><div><span>        </span><span>if</span><span><span> (idx </span><span>==</span><span> </span></span><span>m</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>45</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>wordSquare</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;(idx);</span></div></div><div><div><div>46</div></div><div><span>            </span><span>for</span><span> (</span><span>char</span><span><span>[] </span><span>ca</span><span> </span></span><span>:</span><span> m) {</span></div></div><div><div><div>47</div></div><div><span>                </span><span>wordSquare</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>String</span><span>(ca));</span></div></div><div><div><div>48</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(wordSquare);</span></div></div><div><div><div>50</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>51</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>52</div></div><div>
</div></div><div><div><div>53</div></div><div><span>        </span><span>TrieNode</span><span><span>[] </span><span>tns2</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TrieNode</span><span>[</span><span>tns</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>54</div></div><div>
</div></div><div><div><div>55</div></div><div><span>        </span><span>//for each word in prefix list of this idx node, recursively build the word square starting from cand</span></div></div><div><div><div>56</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>cand</span><span> </span></span><span>:</span><span> tns[idx].</span><span>list</span><span>) {</span></div></div><div><div><div>57</div></div><div><span>            </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> idx;</span></span></div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span>            </span><span>// set m[idx][i] to be cand[idx] the first time in this for loop</span></div></div><div><div><div>60</div></div><div><span>            </span><span>// for every after iteration i, set m[idx][i] and m[i][idx] to be cand[idx+i]</span></div></div><div><div><div>61</div></div><div><span>            </span><span>// check if one of the tns2 possible roots contain that ch, otherwise backtrack from dfs to try another candidate word</span></div></div><div><div><div>62</div></div><div><span>            </span><span>for</span><span><span> (; i </span><span>&lt;</span><span> </span></span><span>m</span><span>.</span><span>length</span><span>; ++i) {</span></div></div><div><div><div>63</div></div><div><span>                </span><span>char</span><span><span> </span><span>ch</span><span> </span></span><span><span>=</span><span> </span></span><span>cand</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>64</div></div><div><span><span>                </span></span><span>m[idx][i] </span><span>=</span><span> ch;</span></div></div><div><div><div>65</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>&gt;</span><span> idx) {</span></span></div></div><div><div><div>66</div></div><div><span>                    </span><span>if</span><span> (tns[i].</span><span>children</span><span><span>[ch </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>67</div></div><div><span>                        </span><span>break</span><span>;</span></div></div><div><div><div>68</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>69</div></div><div><span><span>                    </span></span><span>m[i][idx] </span><span>=</span><span> ch;</span></div></div><div><div><div>70</div></div><div>
</div></div><div><div><div>71</div></div><div><span>                    </span><span>//tns2 serves as the trie node for each position i that we are trying to fill</span></div></div><div><div><div>72</div></div><div><span><span>                    </span></span><span>tns2[i] </span><span>=</span><span> tns[i].</span><span>children</span><span><span>[ch </span><span>-</span><span> </span></span><span>'a'</span><span>];</span></div></div><div><div><div>73</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>74</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>75</div></div><div>
</div></div><div><div><div>76</div></div><div><span>            </span><span>// found a match for every letter in this cand word, then dfs at next level</span></div></div><div><div><div>77</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>==</span><span> </span></span><span>m</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>78</div></div><div><span>                </span><span>dfs</span><span><span>(idx </span><span>+</span><span> </span></span><span>1</span><span>, m, result, tns2);</span></div></div><div><div><div>79</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>80</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>81</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>82</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>426. Convert Binary Search Tree to Sorted Doubly Linked List<a href="#426-convert-binary-search-tree-to-sorted-doubly-linked-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list" target="_blank">https://leetcode.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list</a></p><hr /><p>解题流程分为2步：</p><ol>
<li>用中序遍历，把每一个BST节点之间用双向指针连起来</li>
<li>把头尾节点用双向指针连起来</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>Node</span><span> curr </span><span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>Node</span><span> </span><span>treeToDoublyList</span><span>(</span><span>Node</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>return</span><span> root;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>Node</span><span><span> </span><span>dummyHead</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>curr </span><span>=</span><span> dummyHead;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// inorder tranversal by recursion to connect the original BST</span></div></div><div><div><div>13</div></div><div><span>        </span><span>inOrderConnect</span><span>(root);</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// connect head and tail, notice that current ptr is tail</span></div></div><div><div><div>16</div></div><div><span>        </span><span>curr</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>dummyHead</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>17</div></div><div><span>        </span><span>dummyHead</span><span>.</span><span>right</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> curr;</span></span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> </span><span>dummyHead</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>inOrderConnect</span><span>(</span><span>Node</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>inOrderConnect</span><span>(</span><span>node</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// construct doubly link</span></div></div><div><div><div>30</div></div><div><span>        </span><span>curr</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> node;</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>node</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> curr;</span></span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>curr </span><span>=</span><span> node;</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>inOrderConnect</span><span>(</span><span>node</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>427. Construct Quad Tree<a href="#427-construct-quad-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/construct-quad-tree/" target="_blank">https://leetcode.com/problems/construct-quad-tree/</a></p><hr /><p>深度优先搜索，在四个子区域内不断减半长度，得到的四个新的区域节点，如果这四个区域节点的<code>isLeaf()</code>都返回true，并且节点的<code>val</code>都一致，说明当前节点本身已经是一个子节点了。否则，当前节点就是这四个子节点的父节点。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a QuadTree node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public boolean val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public boolean isLeaf;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>public Node topLeft;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node topRight;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>public Node bottomLeft;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>public Node bottomRight;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>public Node() {</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>this.val = false;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>this.isLeaf = false;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>this.topLeft = null;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>this.topRight = null;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>this.bottomLeft = null;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>this.bottomRight = null;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>public Node(boolean val, boolean isLeaf) {</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>this.val = val;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>this.isLeaf = isLeaf;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>this.topLeft = null;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>this.topRight = null;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>this.bottomLeft = null;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>this.bottomRight = null;</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>public Node(boolean val, boolean isLeaf, Node topLeft, Node topRight, Node bottomLeft, Node bottomRight) {</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>this.val = val;</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>this.isLeaf = isLeaf;</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>this.topLeft = topLeft;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>this.topRight = topRight;</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>this.bottomLeft = bottomLeft;</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>this.bottomRight = bottomRight;</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>};</span></div></div><div><div><div>39</div></div><div><span>*/</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>42</div></div><div><span>    </span><span>public</span><span> </span><span>Node</span><span> </span><span>construct</span><span>(</span><span>int</span><span><span>[][] </span><span>grid</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>43</div></div><div><span>        </span><span>return</span><span> </span><span>helper</span><span>(grid, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>grid</span><span>.</span><span>length</span><span>);</span></div></div><div><div><div>44</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>    </span><span>private</span><span> </span><span>Node</span><span> </span><span>helper</span><span>(</span><span>int</span><span><span>[][] </span><span>grid</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>, </span></span><span>int</span><span><span> </span><span>len</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>47</div></div><div><span>        </span><span>// the minimum grid</span></div></div><div><div><div>48</div></div><div><span>        </span><span>if</span><span><span> (len </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>49</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>Node</span><span><span>(grid[x][y] </span><span>!=</span><span> </span></span><span>0</span><span>, </span><span>true</span><span>);</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>        </span><span>Node</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span>();</span></div></div><div><div><div>53</div></div><div><span>        </span><span>Node</span><span><span> </span><span>topLeft</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span><span>(grid, x, y, len </span><span>/</span><span> </span></span><span>2</span><span>);</span></div></div><div><div><div>54</div></div><div><span>        </span><span>Node</span><span><span> </span><span>topRight</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span><span>(grid, x, y </span><span>+</span><span> len </span><span>/</span><span> </span></span><span>2</span><span><span>, len </span><span>/</span><span> </span></span><span>2</span><span>);</span></div></div><div><div><div>55</div></div><div><span>        </span><span>Node</span><span><span> </span><span>bottomLeft</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span><span>(grid, x </span><span>+</span><span> len </span><span>/</span><span> </span></span><span>2</span><span><span>, y, len </span><span>/</span><span> </span></span><span>2</span><span>);</span></div></div><div><div><div>56</div></div><div><span>        </span><span>Node</span><span><span> </span><span>bottomRight</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span><span>(grid, x </span><span>+</span><span> len </span><span>/</span><span> </span></span><span>2</span><span><span>, y </span><span>+</span><span> len </span><span>/</span><span> </span></span><span>2</span><span><span>, len </span><span>/</span><span> </span></span><span>2</span><span>);</span></div></div><div><div><div>57</div></div><div>
</div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span>        </span><span>if</span><span> (</span><span>topLeft</span><span>.</span><span>isLeaf</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>topRight</span><span>.</span><span>isLeaf</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>bottomLeft</span><span>.</span><span>isLeaf</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>bottomRight</span><span>.</span><span>isLeaf</span></div></div><div><div><div>60</div></div><div><span><span>            </span></span><span>&amp;&amp;</span><span> </span><span>topLeft</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> </span></span><span>topRight</span><span>.</span><span>val</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>topRight</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> </span></span><span>bottomLeft</span><span>.</span><span>val</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>bottomLeft</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> </span></span><span>bottomRight</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>61</div></div><div><span>            </span><span>// current grid has the same value</span></div></div><div><div><div>62</div></div><div><span>            </span><span>result</span><span>.</span><span>isLeaf</span><span><span> </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>63</div></div><div><span>            </span><span>result</span><span>.</span><span>val</span><span><span> </span><span>=</span><span> </span></span><span>topLeft</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>64</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>65</div></div><div><span>            </span><span>// up to parent node</span></div></div><div><div><div>66</div></div><div><span>            </span><span>result</span><span>.</span><span>topLeft</span><span><span> </span><span>=</span><span> topLeft;</span></span></div></div><div><div><div>67</div></div><div><span>            </span><span>result</span><span>.</span><span>topRight</span><span><span> </span><span>=</span><span> topRight;</span></span></div></div><div><div><div>68</div></div><div><span>            </span><span>result</span><span>.</span><span>bottomLeft</span><span><span> </span><span>=</span><span> bottomLeft;</span></span></div></div><div><div><div>69</div></div><div><span>            </span><span>result</span><span>.</span><span>bottomRight</span><span><span> </span><span>=</span><span> bottomRight;</span></span></div></div><div><div><div>70</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>71</div></div><div>
</div></div><div><div><div>72</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>73</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>74</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>428. Serialize and Deserialize N-ary Tree<a href="#428-serialize-and-deserialize-n-ary-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/serialize-and-deserialize-n-ary-tree/" target="_blank">https://leetcode.com/problems/serialize-and-deserialize-n-ary-tree/</a></p><hr /><p>核心是使用前序遍历法。序列化时，按照前序遍历顺序，每一个节点提取出<code>val</code>和子节点的个数进行转化，通过<code> + '0'</code>的操作保证转化后这两个值能用1个字符表示（这里的前提是<code>val</code>和<code>N</code>值都不会很大，例如都是200以内的数）。反序列化时，同样按照前序遍历，把字符转化为具体的值。可以使用一个变量<code>index[1]</code>记录当前处理序列化字符串的下标。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public List&lt;Node&gt; children;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node() {}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>public Node(int _val) {</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>public Node(int _val, List&lt;Node&gt; _children) {</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>children = _children;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>};</span></div></div><div><div><div>18</div></div><div><span>*/</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>class</span><span><span> </span><span>Codec</span><span> </span></span><span>{</span></div></div><div><div><div>21</div></div><div><span>    </span><span>// Encodes a tree to a single string.</span></div></div><div><div><div>22</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>serialize</span><span>(</span><span>Node</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>23</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>24</div></div><div><span>        </span><span>serialize</span><span>(root, sb);</span></div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>serialize</span><span>(</span><span>Node</span><span><span> </span><span>node</span><span>, </span></span><span>StringBuilder</span><span><span> </span><span>sb</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>29</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>30</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>// append value char</span></div></div><div><div><div>34</div></div><div><span>        </span><span>sb</span><span>.</span><span>append</span><span>((</span><span>char</span><span>) (</span><span>node</span><span>.</span><span>val</span><span><span> </span><span>+</span><span> </span></span><span>'0'</span><span>));</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>// append children size char</span></div></div><div><div><div>37</div></div><div><span>        </span><span>sb</span><span>.</span><span>append</span><span>((</span><span>char</span><span>) (</span><span>node</span><span>.</span><span>children</span><span>.</span><span>size</span><span><span>() </span><span>+</span><span> </span></span><span>'0'</span><span>));</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>for</span><span> (</span><span>Node</span><span><span> </span><span>n</span><span> </span></span><span>:</span><span> </span><span>node</span><span>.</span><span>children</span><span>) {</span></div></div><div><div><div>40</div></div><div><span>            </span><span>serialize</span><span>(n, sb);</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>    </span><span>// Decodes your encoded data to tree.</span></div></div><div><div><div>45</div></div><div><span>    </span><span>public</span><span> </span><span>Node</span><span> </span><span>deserialize</span><span>(</span><span>String</span><span><span> </span><span>data</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>46</div></div><div><span>        </span><span>if</span><span><span> (data </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>data</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>47</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span>        </span><span>return</span><span> </span><span>deserialize</span><span>(data, </span><span>new</span><span> </span><span>int</span><span>[</span><span>1</span><span>]);</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>    </span><span>Node</span><span> </span><span>deserialize</span><span>(</span><span>String</span><span><span> </span><span>data</span><span>, </span></span><span>int</span><span><span>[] </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>53</div></div><div><span>        </span><span>int</span><span><span> </span><span>val</span><span> </span></span><span><span>=</span><span> </span></span><span>data</span><span>.</span><span>charAt</span><span>(index[</span><span>0</span><span><span>]) </span><span>-</span><span> </span></span><span>'0'</span><span>;</span></div></div><div><div><div>54</div></div><div><span>        </span><span>int</span><span><span> </span><span>childrenSize</span><span> </span></span><span><span>=</span><span> </span></span><span>data</span><span>.</span><span>charAt</span><span>(++index[</span><span>0</span><span><span>]) </span><span>-</span><span> </span></span><span>'0'</span><span>;</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>        </span><span>Node</span><span><span> </span><span>node</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span>(val, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>Node</span><span>&gt;());</span></div></div><div><div><div>57</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> childrenSize; i++) {</span></span></div></div><div><div><div>58</div></div><div><span><span>            </span></span><span>index[</span><span>0</span><span>]++;</span></div></div><div><div><div>59</div></div><div><span>            </span><span>node</span><span>.</span><span>children</span><span>.</span><span>add</span><span>(</span><span>deserialize</span><span>(data, index));</span></div></div><div><div><div>60</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>61</div></div><div>
</div></div><div><div><div>62</div></div><div><span>        </span><span>return</span><span> node;</span></div></div><div><div><div>63</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>64</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>429. N-ary Tree Level Order Traversal<a href="#429-n-ary-tree-level-order-traversal"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/n-ary-tree-level-order-traversal/" target="_blank">https://leetcode.com/problems/n-ary-tree-level-order-traversal/</a></p><hr /><p>与二叉树层次遍历类似，仍然是使用队列+BFS的思路，队列弹出当前节点时，遍历把所有子节点添加到队列中即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public List&lt;Node&gt; children;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node() {}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>public Node(int _val) {</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>public Node(int _val, List&lt;Node&gt; _children) {</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>children = _children;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>};</span></div></div><div><div><div>18</div></div><div><span>*/</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>21</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>levelOrder</span><span>(</span><span>Node</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>List</span><span>&lt; </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; &gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>Queue</span><span>&lt;</span><span>Node</span><span><span>&gt; </span><span>queue</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>28</div></div><div><span>        </span><span>queue</span><span>.</span><span>offer</span><span>(root);</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>queue</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>31</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>curLevel</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>            </span><span>// these are all nodes in current level</span></div></div><div><div><div>34</div></div><div><span>            </span><span>int</span><span><span> </span><span>currentLevelSize</span><span> </span></span><span><span>=</span><span> </span></span><span>queue</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>35</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> currentLevelSize; i++) {</span></span></div></div><div><div><div>36</div></div><div><span>                </span><span>Node</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>queue</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>37</div></div><div><span>                </span><span>curLevel</span><span>.</span><span>add</span><span>(</span><span>cur</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>                </span><span>// add current node's children to queue</span></div></div><div><div><div>40</div></div><div><span>                </span><span>for</span><span> (</span><span>Node</span><span><span> </span><span>child</span><span> </span></span><span>:</span><span> </span><span>cur</span><span>.</span><span>children</span><span>) {</span></div></div><div><div><div>41</div></div><div><span>                    </span><span>queue</span><span>.</span><span>offer</span><span>(child);</span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span>            </span><span>// finish a level, add current level's value to result</span></div></div><div><div><div>46</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(curLevel);</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>430. Flatten a Multilevel Doubly Linked List<a href="#430-flatten-a-multilevel-doubly-linked-list"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list/" target="_blank">https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list/</a></p><hr /><p>建立一个栈，如果遇到某个节点存在<code>child</code>指针，就把这个节点的<code>next</code>指针存到栈里，以待日后重新返回这一层时不迷路。之后，把这个节点和<code>child</code>指针指向的节点双向连起来，再把<code>child</code>指针删掉。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public Node prev;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>public Node next;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node child;</span></div></div><div><div><div>8</div></div><div><span>};</span></div></div><div><div><div>9</div></div><div><span>*/</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>Node</span><span> </span><span>flatten</span><span>(</span><span>Node</span><span><span> </span><span>head</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>Node</span><span><span> </span><span>dummyHead</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span>(</span><span>0</span><span>, </span><span>null</span><span>, head, </span><span>null</span><span>);</span></div></div><div><div><div>18</div></div><div><span>        </span><span>Node</span><span><span> </span><span>cur</span><span>, </span><span>prev</span><span> </span></span><span><span>=</span><span> dummyHead;</span></span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// set a stack and push head into it</span></div></div><div><div><div>21</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>Node</span><span><span>&gt; </span><span>stack</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>();</span></div></div><div><div><div>22</div></div><div><span>        </span><span>stack</span><span>.</span><span>push</span><span>(head);</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>stack</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>stack</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>            </span><span>// link previous and current node</span></div></div><div><div><div>28</div></div><div><span>            </span><span>prev</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> cur;</span></span></div></div><div><div><div>29</div></div><div><span>            </span><span>cur</span><span>.</span><span>prev</span><span><span> </span><span>=</span><span> prev;</span></span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>            </span><span>// push next node or child node</span></div></div><div><div><div>32</div></div><div><span>            </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) </span><span>stack</span><span>.</span><span>push</span><span>(</span><span>cur</span><span>.</span><span>next</span><span>);</span></div></div><div><div><div>33</div></div><div><span>            </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>child</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>34</div></div><div><span>                </span><span>stack</span><span>.</span><span>push</span><span>(</span><span>cur</span><span>.</span><span>child</span><span>);</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>                </span><span>// unlink current node with child</span></div></div><div><div><div>37</div></div><div><span>                </span><span>cur</span><span>.</span><span>child</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>            </span><span>// move pointers forward</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>prev </span><span>=</span><span> cur;</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>        </span><span>// link first node with dummyHead to make a valid doubly linked list</span></div></div><div><div><div>45</div></div><div><span>        </span><span>dummyHead</span><span>.</span><span>next</span><span>.</span><span>prev</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>        </span><span>return</span><span> </span><span>dummyHead</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>431. Encode N-ary Tree to Binary Tree<a href="#431-encode-n-ary-tree-to-binary-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/encode-n-ary-tree-to-binary-tree/" target="_blank">https://leetcode.com/problems/encode-n-ary-tree-to-binary-tree/</a></p><hr /><p>把<code>N</code>叉树转化成二叉树时，总是将当前节点的第一个子节点转化成左儿子，剩下的儿子递归组成左儿子的右子树。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public List&lt;Node&gt; children;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node() {}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>public Node(int _val) {</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>public Node(int _val, List&lt;Node&gt; _children) {</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>children = _children;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>};</span></div></div><div><div><div>18</div></div><div><span>*/</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>/**</span></div></div><div><div><div>21</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>22</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>23</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>24</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>25</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>26</div></div><div><span><span> </span></span><span>*     TreeNode(int x) { val = x; }</span></div></div><div><div><div>27</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>28</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>class</span><span><span> </span><span>Codec</span><span> </span></span><span>{</span></div></div><div><div><div>31</div></div><div><span>    </span><span>// Encodes an n-ary tree to a binary tree.</span></div></div><div><div><div>32</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>encode</span><span>(</span><span>Node</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>33</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>34</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeNode</span><span>(</span><span>root</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>// next level -&gt; left</span></div></div><div><div><div>39</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>children</span><span>.</span><span>size</span><span><span>() </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>40</div></div><div><span>            </span><span>result</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>encode</span><span>(</span><span>root</span><span>.</span><span>children</span><span>.</span><span>get</span><span>(</span><span>0</span><span>));</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>        </span><span>// same level -&gt; right</span></div></div><div><div><div>44</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>result</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>45</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>root</span><span>.</span><span>children</span><span>.</span><span>size</span><span>(); i++) {</span></div></div><div><div><div>46</div></div><div><span>            </span><span>cur</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>encode</span><span>(</span><span>root</span><span>.</span><span>children</span><span>.</span><span>get</span><span>(i));</span></div></div><div><div><div>47</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>    </span><span>// Decodes your binary tree to an n-ary tree.</span></div></div><div><div><div>53</div></div><div><span>    </span><span>public</span><span> </span><span>Node</span><span> </span><span>decode</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>54</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>55</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>56</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>57</div></div><div><span>        </span><span>Node</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span>(</span><span>root</span><span>.</span><span>val</span><span>, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;());</span></div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span>        </span><span>// first child is root.left, all other children are on the right subtree</span></div></div><div><div><div>60</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>root</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>61</div></div><div><span>        </span><span>while</span><span><span> (cur </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>62</div></div><div><span>            </span><span>result</span><span>.</span><span>children</span><span>.</span><span>add</span><span>(</span><span>decode</span><span>(cur));</span></div></div><div><div><div>63</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>64</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>65</div></div><div>
</div></div><div><div><div>66</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>67</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>68</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>432. All O`one Data Structure<a href="#432-all-oone-data-structure"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/all-oone-data-structure/" target="_blank">https://leetcode.com/problems/all-oone-data-structure/</a></p><hr /><p>对于插入和删除操作，使用HashMap可以轻松达到O(1)复杂度。而在此基础上，要想实现取最值也是O(1)复杂度，还需要借助双向链表LinkedHashSet。人工维护一个按照value大小排序的链表，每个链表节点中包含一个LinkedHashSet，里面存储了所有value为当前链表节点值的<code>key</code>。每一次插入删除节点时，更新链表以及节点的LinkedHashSet。具体而言，需要时刻跟踪链表的<code>head</code>和<code>tail</code>两个头尾节点：</p><ul>
<li>插入<code>key</code>时，检查这个节点是不是新的节点
<ul>
<li>如果是，把<code>head</code>和<code>tail</code>都指向这个节点，更新节点中的Set以及全局Map</li>
<li>如果不是，这个<code>key</code>对应的节点value自增。由于发生了自增，需要把<code>key</code>从之前的节点Set中踢掉，然后用新value创建一个新节点，把新节点插到原来节点的后面，再把<code>key</code>插到新节点的<code>key</code>中去。最后更新全局Map</li>
</ul>
</li>
<li>删除<code>key</code>时，需要确认这个<code>key</code>是否存在，之后
<ul>
<li>如果是头节点，直接更新<code>head</code>和<code>tail</code></li>
<li>否则，由于发生了自减，把把<code>key</code>从原来节点Set中踢掉，然后用新value创建一个新节点，把新节点插到原来节点的前面，再把<code>key</code>插到新节点的<code>key</code>中去。最后更新全局Map</li>
</ul>
</li>
<li>获取最大最小值，直接从链表<code>head</code>和<code>tail</code>节点中的Set中提取，调用迭代器方法即可</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>AllOne</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>Map</span><span>&lt;</span><span>String</span><span><span>,</span><span> </span></span><span>Node</span><span><span>&gt;</span><span> map</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>Node</span><span><span> head</span><span>,</span><span> tail</span></span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>class</span><span><span> </span><span>Node</span><span> </span></span><span>{</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span> val</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>LinkedHashSet</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> keys</span></span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>Node</span><span><span> next</span><span>,</span><span> pre</span></span><span>;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>public</span><span> </span><span>Node</span><span>(</span><span>int</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>11</div></div><div><span>            </span><span>this</span><span>.</span><span>val</span><span><span> </span><span>=</span><span> val;</span></span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>keys </span><span>=</span><span> </span><span>new</span><span> </span><span>LinkedHashSet</span><span>();</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>next </span><span>=</span><span> pre </span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>/** Initialize your data structure here. */</span></div></div><div><div><div>18</div></div><div><span>    </span><span>public</span><span> </span><span>AllOne</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>map </span><span>=</span><span> </span><span>new</span><span> </span><span>HashMap</span><span>();</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>head </span><span>=</span><span> tail </span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>/** Inserts a new key &lt;Key&gt; with value 1. Or increments an existing key by 1. */</span></div></div><div><div><div>24</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>inc</span><span>(</span><span>String</span><span><span> </span><span>key</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span>(key)) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>// get old node</span></div></div><div><div><div>27</div></div><div><span>            </span><span>Node</span><span><span> </span><span>node</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>get</span><span>(key);</span></div></div><div><div><div>28</div></div><div><span>            </span><span>int</span><span><span> </span><span>val</span><span> </span></span><span><span>=</span><span> </span></span><span>node</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>// remove old key in the old node</span></div></div><div><div><div>31</div></div><div><span>            </span><span>node</span><span>.</span><span>keys</span><span>.</span><span>remove</span><span>(key);</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>            </span><span>// add new node with new val</span></div></div><div><div><div>34</div></div><div><span>            </span><span>if</span><span> (</span><span>node</span><span>.</span><span>next</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>node</span><span>.</span><span>next</span><span>.</span><span>val</span><span><span> </span><span>!=</span><span> val </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>35</div></div><div><span>                </span><span>Node</span><span><span> </span><span>newNode</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span><span>(val </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>36</div></div><div><span>                </span><span>newNode</span><span>.</span><span>pre</span><span><span> </span><span>=</span><span> node;</span></span></div></div><div><div><div>37</div></div><div><span>                </span><span>newNode</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>node</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>38</div></div><div><span>                </span><span>node</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> newNode;</span></span></div></div><div><div><div>39</div></div><div><span>                </span><span>if</span><span> (</span><span>newNode</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>40</div></div><div><span>                    </span><span>newNode</span><span>.</span><span>next</span><span>.</span><span>pre</span><span><span> </span><span>=</span><span> newNode;</span></span></div></div><div><div><div>41</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>            </span><span>// add new key to the next node</span></div></div><div><div><div>45</div></div><div><span>            </span><span>node</span><span>.</span><span>next</span><span>.</span><span>keys</span><span>.</span><span>add</span><span>(key);</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>            </span><span>// update node</span></div></div><div><div><div>48</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(key, </span><span>node</span><span>.</span><span>next</span><span>);</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>            </span><span>// update head</span></div></div><div><div><div>51</div></div><div><span>            </span><span>if</span><span> (</span><span>node</span><span>.</span><span>keys</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>52</div></div><div><span>                </span><span>if</span><span><span> (node </span><span>==</span><span> head) {</span></span></div></div><div><div><div>53</div></div><div><span><span>                    </span></span><span>head </span><span>=</span><span> </span><span>node</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>54</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span>                </span><span>node</span><span>.</span><span>next</span><span>.</span><span>pre</span><span><span> </span><span>=</span><span> </span></span><span>node</span><span>.</span><span>pre</span><span>;</span></div></div><div><div><div>56</div></div><div><span>                </span><span>if</span><span> (</span><span>node</span><span>.</span><span>pre</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>57</div></div><div><span>                    </span><span>node</span><span>.</span><span>pre</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>node</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>58</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>59</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>60</div></div><div>
</div></div><div><div><div>61</div></div><div><span>            </span><span>// update tail</span></div></div><div><div><div>62</div></div><div><span>            </span><span>if</span><span><span> (tail </span><span>==</span><span> node) {</span></span></div></div><div><div><div>63</div></div><div><span><span>                </span></span><span>tail </span><span>=</span><span> </span><span>node</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>64</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>65</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>66</div></div><div><span>            </span><span>if</span><span><span> (head </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>head</span><span>.</span><span>val</span><span><span> </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>67</div></div><div><span>                </span><span>Node</span><span><span> </span><span>node</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span>(</span><span>1</span><span>);</span></div></div><div><div><div>68</div></div><div><span>                </span><span>node</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> head;</span></span></div></div><div><div><div>69</div></div><div><span>                </span><span>if</span><span><span> (head </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>70</div></div><div><span>                    </span><span>head</span><span>.</span><span>pre</span><span><span> </span><span>=</span><span> node;</span></span></div></div><div><div><div>71</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>72</div></div><div><span><span>                </span></span><span>head </span><span>=</span><span> node;</span></div></div><div><div><div>73</div></div><div><span>                </span><span>if</span><span><span> (tail </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>74</div></div><div><span><span>                    </span></span><span>tail </span><span>=</span><span> node;</span></div></div><div><div><div>75</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>76</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>77</div></div><div><span>            </span><span>head</span><span>.</span><span>keys</span><span>.</span><span>add</span><span>(key);</span></div></div><div><div><div>78</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(key, head);</span></div></div><div><div><div>79</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>80</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>81</div></div><div>
</div></div><div><div><div>82</div></div><div><span><span>    </span></span><span>/** Decrements an existing key by 1. If Key's value is 1, remove it from the data structure. */</span></div></div><div><div><div>83</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>dec</span><span>(</span><span>String</span><span><span> </span><span>key</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>84</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>map</span><span>.</span><span>containsKey</span><span>(key)) {</span></div></div><div><div><div>85</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>86</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>87</div></div><div>
</div></div><div><div><div>88</div></div><div><span>        </span><span>// get old node</span></div></div><div><div><div>89</div></div><div><span>        </span><span>Node</span><span><span> </span><span>node</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>get</span><span>(key);</span></div></div><div><div><div>90</div></div><div><span>        </span><span>int</span><span><span> </span><span>val</span><span> </span></span><span><span>=</span><span> </span></span><span>node</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>91</div></div><div>
</div></div><div><div><div>92</div></div><div><span>        </span><span>// remove old val from old node</span></div></div><div><div><div>93</div></div><div><span>        </span><span>node</span><span>.</span><span>keys</span><span>.</span><span>remove</span><span>(key);</span></div></div><div><div><div>94</div></div><div>
</div></div><div><div><div>95</div></div><div><span>        </span><span>// remove old key from map</span></div></div><div><div><div>96</div></div><div><span>        </span><span>map</span><span>.</span><span>remove</span><span>(key);</span></div></div><div><div><div>97</div></div><div>
</div></div><div><div><div>98</div></div><div><span>        </span><span>// if it's head, update head and tail</span></div></div><div><div><div>99</div></div><div><span>        </span><span>if</span><span><span> (val </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>100</div></div><div><span>            </span><span>if</span><span> (</span><span>node</span><span>.</span><span>keys</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>101</div></div><div><span>                </span><span>if</span><span><span> (head </span><span>==</span><span> node) {</span></span></div></div><div><div><div>102</div></div><div><span><span>                    </span></span><span>head </span><span>=</span><span> </span><span>node</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>103</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>104</div></div><div><span>                </span><span>if</span><span><span> (head </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>105</div></div><div><span>                    </span><span>head</span><span>.</span><span>pre</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>106</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>107</div></div><div><span>                </span><span>if</span><span><span> (tail </span><span>==</span><span> node) {</span></span></div></div><div><div><div>108</div></div><div><span><span>                    </span></span><span>tail </span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>109</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>110</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>111</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>112</div></div><div><span>            </span><span>// add new node at pre position</span></div></div><div><div><div>113</div></div><div><span>            </span><span>if</span><span> (</span><span>node</span><span>.</span><span>pre</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>node</span><span>.</span><span>pre</span><span>.</span><span>val</span><span><span> </span><span>!=</span><span> val </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>114</div></div><div><span>                </span><span>Node</span><span><span> </span><span>newNode</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span><span>(val </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>115</div></div><div><span>                </span><span>newNode</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> node;</span></span></div></div><div><div><div>116</div></div><div><span>                </span><span>newNode</span><span>.</span><span>pre</span><span><span> </span><span>=</span><span> </span></span><span>node</span><span>.</span><span>pre</span><span>;</span></div></div><div><div><div>117</div></div><div><span>                </span><span>node</span><span>.</span><span>pre</span><span><span> </span><span>=</span><span> newNode;</span></span></div></div><div><div><div>118</div></div><div><span>                </span><span>if</span><span> (</span><span>newNode</span><span>.</span><span>pre</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>119</div></div><div><span>                    </span><span>newNode</span><span>.</span><span>pre</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> newNode;</span></span></div></div><div><div><div>120</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>121</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>122</div></div><div>
</div></div><div><div><div>123</div></div><div><span>            </span><span>// add new key to the newNode or pre node</span></div></div><div><div><div>124</div></div><div><span>            </span><span>node</span><span>.</span><span>pre</span><span>.</span><span>keys</span><span>.</span><span>add</span><span>(key);</span></div></div><div><div><div>125</div></div><div>
</div></div><div><div><div>126</div></div><div><span>            </span><span>// update node</span></div></div><div><div><div>127</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(key, </span><span>node</span><span>.</span><span>pre</span><span>);</span></div></div><div><div><div>128</div></div><div>
</div></div><div><div><div>129</div></div><div><span>            </span><span>// update tail</span></div></div><div><div><div>130</div></div><div><span>            </span><span>if</span><span> (</span><span>node</span><span>.</span><span>keys</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>131</div></div><div><span>                </span><span>if</span><span><span> (tail </span><span>==</span><span> node) {</span></span></div></div><div><div><div>132</div></div><div><span><span>                    </span></span><span>tail </span><span>=</span><span> </span><span>node</span><span>.</span><span>pre</span><span>;</span></div></div><div><div><div>133</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>134</div></div><div><span>                </span><span>node</span><span>.</span><span>pre</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> </span></span><span>node</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>135</div></div><div><span>                </span><span>if</span><span> (</span><span>node</span><span>.</span><span>next</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>136</div></div><div><span>                    </span><span>node</span><span>.</span><span>next</span><span>.</span><span>pre</span><span><span> </span><span>=</span><span> </span></span><span>node</span><span>.</span><span>pre</span><span>;</span></div></div><div><div><div>137</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>138</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>139</div></div><div>
</div></div><div><div><div>140</div></div><div><span>            </span><span>// update head</span></div></div><div><div><div>141</div></div><div><span>            </span><span>if</span><span><span> (head </span><span>==</span><span> node) {</span></span></div></div><div><div><div>142</div></div><div><span><span>                </span></span><span>head </span><span>=</span><span> </span><span>node</span><span>.</span><span>pre</span><span>;</span></div></div><div><div><div>143</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>144</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>145</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>146</div></div><div>
</div></div><div><div><div>147</div></div><div><span><span>    </span></span><span>/** Returns one of the keys with maximal value. */</span></div></div><div><div><div>148</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>getMaxKey</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>149</div></div><div><span>        </span><span>return</span><span><span> tail </span><span>==</span><span> </span></span><span>null</span><span> </span><span>?</span><span> </span><span>""</span><span> </span><span>:</span><span> </span><span>tail</span><span>.</span><span>keys</span><span>.</span><span>iterator</span><span>().</span><span>next</span><span>();</span></div></div><div><div><div>150</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>151</div></div><div>
</div></div><div><div><div>152</div></div><div><span><span>    </span></span><span>/** Returns one of the keys with Minimal value. */</span></div></div><div><div><div>153</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>getMinKey</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>154</div></div><div><span>        </span><span>return</span><span><span> head </span><span>==</span><span> </span></span><span>null</span><span> </span><span>?</span><span> </span><span>""</span><span> </span><span>:</span><span> </span><span>head</span><span>.</span><span>keys</span><span>.</span><span>iterator</span><span>().</span><span>next</span><span>();</span></div></div><div><div><div>155</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>156</div></div><div><span>}</span></div></div><div><div><div>157</div></div><div>
</div></div><div><div><div>158</div></div><div><span>/**</span></div></div><div><div><div>159</div></div><div><span><span> </span></span><span>* Your AllOne object will be instantiated and called as such:</span></div></div><div><div><div>160</div></div><div><span><span> </span></span><span>* AllOne obj = new AllOne();</span></div></div><div><div><div>161</div></div><div><span><span> </span></span><span>* obj.inc(key);</span></div></div><div><div><div>162</div></div><div><span><span> </span></span><span>* obj.dec(key);</span></div></div><div><div><div>163</div></div><div><span><span> </span></span><span>* String param_3 = obj.getMaxKey();</span></div></div><div><div><div>164</div></div><div><span><span> </span></span><span>* String param_4 = obj.getMinKey();</span></div></div><div><div><div>165</div></div><div><span><span> </span></span><span>*/</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>433. Minimum Genetic Mutation<a href="#433-minimum-genetic-mutation"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minimum-genetic-mutation/" target="_blank">https://leetcode.com/problems/minimum-genetic-mutation/</a></p><hr /><p>使用回溯算法，遍历<code>bank</code>，每一次mutate一个字母，看是否能得到<code>end</code>；如果不能，退回尝试mutate其他字母。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> count </span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minMutation</span><span>(</span><span>String</span><span><span> </span><span>start</span><span>, </span></span><span>String</span><span><span> </span><span>end</span><span>, </span></span><span>String</span><span><span>[] </span><span>bank</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>recurse</span><span>(start, end, bank, </span><span>0</span><span>, </span><span>new</span><span> </span><span>HashSet</span><span>&lt;</span><span>String</span><span>&gt;());</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span><span> count </span><span>==</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span> </span><span>?</span><span><span> </span><span>-</span></span><span>1</span><span> </span><span>:</span><span> count;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>recurse</span><span>(</span><span>String</span><span><span> </span><span>start</span><span>, </span></span><span>String</span><span><span> </span><span>end</span><span>, </span></span><span>String</span><span><span>[] </span><span>bank</span><span>, </span></span><span>int</span><span><span> </span><span>mutateNum</span><span>, </span></span><span>Set</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>visited</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>if</span><span> (</span><span>start</span><span>.</span><span>equals</span><span>(end)) {</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>count </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(count, mutateNum);</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>e</span><span> </span></span><span>:</span><span> bank) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>int</span><span><span> </span><span>diff</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>// only 1 diff is allowed to mutate to the next state</span></div></div><div><div><div>18</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>e</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>if</span><span> (</span><span>start</span><span>.</span><span>charAt</span><span><span>(i) </span><span>!=</span><span> </span></span><span>e</span><span>.</span><span>charAt</span><span>(i)) {</span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>diff++;</span></div></div><div><div><div>21</div></div><div><span>                    </span><span>if</span><span><span> (diff </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>22</div></div><div><span>                        </span><span>break</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>            </span><span>// backtrack, try to mutate to next state then come back</span></div></div><div><div><div>28</div></div><div><span>            </span><span>if</span><span><span> (diff </span><span>==</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> </span><span>!</span></span><span>visited</span><span>.</span><span>contains</span><span>(e)) {</span></div></div><div><div><div>29</div></div><div><span>                </span><span>visited</span><span>.</span><span>add</span><span>(e);</span></div></div><div><div><div>30</div></div><div><span>                </span><span>recurse</span><span><span>(e, end, bank, mutateNum </span><span>+</span><span> </span></span><span>1</span><span>, visited);</span></div></div><div><div><div>31</div></div><div><span>                </span><span>visited</span><span>.</span><span>remove</span><span>(e);</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>434. Number of Segments in a String<a href="#434-number-of-segments-in-a-string"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/number-of-segments-in-a-string/" target="_blank">https://leetcode.com/problems/number-of-segments-in-a-string/</a></p><hr /><p>去掉空白部分，再分割字符串。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>countSegments</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>s </span><span>=</span><span> </span><span>s</span><span>.</span><span>trim</span><span>();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>split</span><span>(</span><span>"</span><span>\\</span><span>s+"</span><span>);</span></div></div><div><div><div>9</div></div><div><span>        </span><span>return</span><span> </span><span>result</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>435. Non-overlapping Intervals<a href="#435-non-overlapping-intervals"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/non-overlapping-intervals/" target="_blank">https://leetcode.com/problems/non-overlapping-intervals/</a></p><hr /><p>按照每个区间的尾元素，从小到大排序。之后遍历所有区间，如果相邻两个区间不重叠，就把不重叠的区间个数加1。最后将所有区间个数减去不重叠的区间个数，得到需要移除的区间个数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>eraseOverlapIntervals</span><span>(</span><span>int</span><span><span>[][] </span><span>intervals</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (intervals </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> intervals[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// sort by end element</span></div></div><div><div><div>8</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(intervals, (</span><span>int</span><span>[] a, </span><span>int</span><span>[] b) </span><span>-&gt;</span><span> { </span><span>return</span><span> a[</span><span>1</span><span><span>] </span><span>-</span><span> b[</span></span><span>1</span><span>]; });</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>end</span><span> </span></span><span><span>=</span><span> intervals[</span></span><span>0</span><span>][</span><span>1</span><span>];</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>nonOverlap</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span> (intervals[i][</span><span>0</span><span><span>] </span><span>&gt;=</span><span> end) {</span></span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>end </span><span>=</span><span> intervals[i][</span><span>1</span><span>];</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>nonOverlap++;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> </span><span>intervals</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> nonOverlap;</span></span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>436. Find Right Interval<a href="#436-find-right-interval"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-right-interval/" target="_blank">https://leetcode.com/problems/find-right-interval/</a></p><hr /><p>使用桶，找出最小的<code>start</code>和最大的<code>end</code>，确定桶的大小。因为每个区间的<code>start</code>是唯一的，因此能够根据每个区间的<code>start</code>值，判断应该丢在哪个桶内。处理之后，每个桶里存放的就是下一个区间的起始值。注意部分桶可能为空，因此需要用相邻非空桶里的值覆盖。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>findRightInterval</span><span>(</span><span>int</span><span><span>[][] </span><span>intervals</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (intervals </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> intervals[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[] {};</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>intervals</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// find min start and max end</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>min</span><span> </span></span><span><span>=</span><span> intervals[</span></span><span>0</span><span>][</span><span>0</span><span><span>], max </span><span>=</span><span> intervals[</span></span><span>0</span><span>][</span><span>1</span><span>];</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span> ; i </span><span>&lt;</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>min </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(min, intervals[i][</span><span>0</span><span>]);</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>max </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(max, intervals[i][</span><span>1</span><span>]);</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>buckets</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[max </span><span>-</span><span> min </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>17</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span><span>(buckets, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>buckets[intervals[i][</span><span>0</span><span><span>] </span><span>-</span><span> min] </span><span>=</span><span> i;</span></span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>buckets</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>2</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>if</span><span><span> (buckets[i] </span><span>==</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>buckets[i] </span><span>=</span><span> buckets[i</span><span>+</span><span>1</span><span>];</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>intervals</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>result[i] </span><span>=</span><span> buckets[intervals[i][</span><span>1</span><span><span>] </span><span>-</span><span> min];</span></span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>437. Path Sum III<a href="#437-path-sum-iii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/path-sum-iii/" target="_blank">https://leetcode.com/problems/path-sum-iii/</a></p><hr /><p>使用一个Hashmap，统计每一条path sum以及对应出现的次数。遍历每一个节点的时候，可能出现的path sum由三部分组成：</p><ol>
<li>以某个上层节点起始，当前节点结束的路径</li>
<li>左子树中的路径</li>
<li>右子树中的路径</li>
</ol><p>在每完成一次递归调用返回上层时，需要注意把map中当前path sum对应的出现次数减少1。（可以理解为，通过左子树累加出来的次数，并不能对右子树产生效果，反之同理）</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>pathSum</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>, </span></span><span>int</span><span><span> </span><span>sum</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// &lt;root to current node's sum, frequency&gt;</span></div></div><div><div><div>23</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Long</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>24</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(</span><span>0L</span><span>, </span><span>1</span><span>);</span></div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> </span><span>findPathSum</span><span>(root, </span><span>0</span><span>, sum, map);</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>findPathSum</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>, </span></span><span>long</span><span><span> </span><span>sum</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>, </span></span><span>Map</span><span>&lt;</span><span>Long</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>29</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>30</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>// update the prefix sum by adding the current node's val</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>sum </span><span>+=</span><span> </span><span>node</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>// get the number of valid path, ended by the current node</span></div></div><div><div><div>37</div></div><div><span>        </span><span>int</span><span><span> </span><span>numPathToCurr</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>getOrDefault</span><span><span>(sum </span><span>-</span><span> target, </span></span><span>0</span><span>);</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>// update the map with the current sum</span></div></div><div><div><div>40</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(sum, </span><span>map</span><span>.</span><span>getOrDefault</span><span>(sum, </span><span>0</span><span><span>) </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>// the total number of valid paths in the subtree rooted at the current node's left child</span></div></div><div><div><div>43</div></div><div><span>        </span><span>// the total number of valid paths in the subtree rooted at the current node's right child</span></div></div><div><div><div>44</div></div><div><span>        </span><span>// the number of valid paths ended by the current node</span></div></div><div><div><div>45</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> numPathToCurr </span><span>+</span><span> </span></span><span>findPathSum</span><span>(</span><span>node</span><span>.</span><span>left</span><span><span>, sum, target, map) </span><span>+</span><span> </span></span><span>findPathSum</span><span>(</span><span>node</span><span>.</span><span>right</span><span>, sum, target, map);</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>        </span><span>// restore the map, as the recursion goes from the bottom to the top</span></div></div><div><div><div>48</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(sum, </span><span>map</span><span>.</span><span>get</span><span><span>(sum) </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>51</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>52</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>438. Find All Anagrams in a String<a href="#438-find-all-anagrams-in-a-string"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-all-anagrams-in-a-string/" target="_blank">https://leetcode.com/problems/find-all-anagrams-in-a-string/</a></p><hr /><p>使用双指针滑动窗口，用一个变量<code>count</code>统计频率为正的字母个数。移动滑动窗口时，如果<code>count</code>为0，说明窗口中能组成一个anagram。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>findAnagrams</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>String</span><span><span> </span><span>p</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> p </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>p</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>arr</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>p</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>arr[</span><span>p</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span>]++;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, right </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>p</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>15</div></div><div><span>        </span><span>while</span><span><span> (right </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>// character is existing in the map, update count and map</span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span> (arr[</span><span>s</span><span>.</span><span>charAt</span><span><span>(right) </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>&gt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>count--;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>arr[</span><span>s</span><span>.</span><span>charAt</span><span><span>(right) </span><span>-</span><span> </span></span><span>'a'</span><span>]--;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>right++;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>            </span><span>// sum of all frequency &gt;= 0, and count is the sum of all positive frequency</span></div></div><div><div><div>25</div></div><div><span>            </span><span>// so, every frequency is 0 if and only if count is 0</span></div></div><div><div><div>26</div></div><div><span>            </span><span>if</span><span><span> (count </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(left);</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>// window size is p's length, shrink the window size from the begin</span></div></div><div><div><div>31</div></div><div><span>            </span><span>if</span><span><span> (right </span><span>-</span><span> left </span><span>==</span><span> </span></span><span>p</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>32</div></div><div><span>                </span><span>// restore a freq, and only update if in the map</span></div></div><div><div><div>33</div></div><div><span>                </span><span>if</span><span> (arr[</span><span>s</span><span>.</span><span>charAt</span><span><span>(left) </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>&gt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>34</div></div><div><span><span>                    </span></span><span>count++;</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>arr[</span><span>s</span><span>.</span><span>charAt</span><span><span>(left) </span><span>-</span><span> </span></span><span>'a'</span><span>]++;</span></div></div><div><div><div>37</div></div><div><span><span>                </span></span><span>left++;</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>439. Ternary Expression Parser<a href="#439-ternary-expression-parser"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/ternary-expression-parser/" target="_blank">https://leetcode.com/problems/ternary-expression-parser/</a></p><hr /><p>统计<code>?</code>和<code>:</code>的配对情况，遍历时如果遇到的<code>?</code>和<code>:</code>数量相同，就检查<code>?</code>之前是T还是F，并根据相应true或false情况，截取对应的子字符串进行递归检查。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>parseTernary</span><span>(</span><span>String</span><span><span> </span><span>expression</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>expression</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>if</span><span> (</span><span>expression</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>'?'</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>                </span><span>int</span><span><span> </span><span>flag</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>6</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i </span><span>+</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>expression</span><span>.</span><span>length</span><span>(); j++) {</span></div></div><div><div><div>7</div></div><div><span>                    </span><span>if</span><span> (</span><span>expression</span><span>.</span><span>charAt</span><span><span>(j) </span><span>==</span><span> </span></span><span>'?'</span><span>) {</span></div></div><div><div><div>8</div></div><div><span><span>                        </span></span><span>flag++;</span></div></div><div><div><div>9</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>                    </span><span>if</span><span> (</span><span>expression</span><span>.</span><span>charAt</span><span><span>(j) </span><span>==</span><span> </span></span><span>':'</span><span>) {</span></div></div><div><div><div>11</div></div><div><span><span>                        </span></span><span>flag--;</span></div></div><div><div><div>12</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>                    </span><span>// ? and : are equal now</span></div></div><div><div><div>15</div></div><div><span>                    </span><span>if</span><span><span> (flag </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>                        </span><span>if</span><span> (</span><span>expression</span><span>.</span><span>charAt</span><span><span>(i</span><span>-</span></span><span>1</span><span><span>) </span><span>==</span><span> </span></span><span>'T'</span><span>) {</span></div></div><div><div><div>17</div></div><div><span>                            </span><span>return</span><span> </span><span>parseTernary</span><span>(</span><span>expression</span><span>.</span><span>substring</span><span><span>(i</span><span>+</span></span><span>1</span><span>, j));</span></div></div><div><div><div>18</div></div><div><span><span>                        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>19</div></div><div><span>                            </span><span>return</span><span> </span><span>parseTernary</span><span>(</span><span>expression</span><span>.</span><span>substring</span><span><span>(j</span><span>+</span></span><span>1</span><span>, </span><span>expression</span><span>.</span><span>length</span><span>()));</span></div></div><div><div><div>20</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> expression;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>440. K-th Smallest in Lexicographical Order<a href="#440-k-th-smallest-in-lexicographical-order"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/k-th-smallest-in-lexicographical-order/" target="_blank">https://leetcode.com/problems/k-th-smallest-in-lexicographical-order/</a></p><hr /><p>可以把起始的1～9看成9棵树的根节点。对于根节点1，它有10个儿子，分别是10, 11, 12, … 19，而这10个子节点分别又可以有10个子节点，例如节点10有儿子100, 101, 102…以此类推，只要没有超过范围<code>n</code>，每个节点都可以有10个子节点，因此问题也就转化为了十叉树的先后遍历问题。</p><p>要确定每棵树的大小，其实就是确定以当前节点为根，子树中节点中的个数。观察发现，对于节点<code>i</code>，子节点中最小的一个节点一定是<code>10*i</code>。通过逐层*10，能够确定每一层的节点大小范围，进而确定每一层的节点个数，由此得到树的大小。之后，将树的大小与k进行判断，如果树的大小小于k，说明目标值并不在当前的树中，直接跳过；否则，才继续递归查找子树。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findKthNumber</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>long</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>while</span><span><span> (k </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>long</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>findSubTreeCount</span><span>(cur, n);</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (count </span><span>&lt;=</span><span> k </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>                </span><span>// travel to next tree</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>k </span><span>-=</span><span> count;</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>cur </span><span>=</span><span> cur </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>// travel to leftmost child</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>cur </span><span>=</span><span> cur </span><span>*</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>k </span><span>-=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> (</span><span>int</span><span>)cur;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>    </span><span>private</span><span> </span><span>long</span><span> </span><span>findSubTreeCount</span><span>(</span><span>long</span><span><span> </span><span>cur</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>23</div></div><div><span>        </span><span>long</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>24</div></div><div><span>        </span><span>long</span><span><span> </span><span>upper</span><span> </span></span><span><span>=</span><span> cur </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>while</span><span><span> (cur </span><span>&lt;=</span><span> n) {</span></span></div></div><div><div><div>27</div></div><div><span>            </span><span>// number of nodes in this level</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>count </span><span>+=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(n </span><span>+</span><span> </span></span><span>1</span><span><span>, upper) </span><span>-</span><span> cur;</span></span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> cur </span><span>*</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>upper </span><span>=</span><span> upper </span><span>*</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span> count;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>441. Arranging Coins<a href="#441-arranging-coins"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/arranging-coins/" target="_blank">https://leetcode.com/problems/arranging-coins/</a></p><hr /><p>解方程即可，注意考虑溢出问题。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>arrangeCoins</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span> (</span><span>int</span><span><span>)((</span><span>-</span></span><span>1</span><span><span> </span><span>+</span><span> </span></span><span>Math</span><span>.</span><span>sqrt</span><span>(</span><span>1</span><span><span> </span><span>+</span><span> </span></span><span>8</span><span><span> </span><span>*</span><span> (</span></span><span>long</span><span><span>)n)) </span><span>/</span><span> </span></span><span>2</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>442. Find All Duplicates in an Array<a href="#442-find-all-duplicates-in-an-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-all-duplicates-in-an-array/" target="_blank">https://leetcode.com/problems/find-all-duplicates-in-an-array/</a></p><hr /><p>由于数组中的数范围都在1到<code>n</code>之间，因此可以遍历数组做一个映射，遇到数字<code>num</code>的时候，把<code>nums[abs(num)] - 1</code>对应的数翻转成负数。在翻转前进行判断，如果已经是负数了，说明之前遇到过<code>num</code>，这就是一个重复数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>findDuplicates</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(nums[i]) </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span><span> (nums[index] </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>8</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span><span>(index </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>nums[index] </span><span>=</span><span> </span><span>-</span><span>nums[index];</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>443. String Compression<a href="#443-string-compression"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/string-compression/" target="_blank">https://leetcode.com/problems/string-compression/</a></p><hr /><p>由于限定只能用O(1)的空间，因此只能用双指针遍历输入字符数组，右边的处理每个字符，左边的负责原地修改数组内容。解题流程分为3步：</p><ol>
<li>遇到相同的字符就用循环跳过，并统计出现的相同字符个数，直到遇上下一个不同的字符</li>
<li>把当前处理的字符拷贝到数组左侧</li>
<li>如果当前的字符被压缩，把重复的个数转化成字符串，添加到字符后面</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>compress</span><span>(</span><span>char</span><span><span>[] </span><span>chars</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, index </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>while</span><span><span> (index </span><span>&lt;</span><span> </span></span><span>chars</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>char</span><span><span> </span><span>currentChar</span><span> </span></span><span><span>=</span><span> chars[index];</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>            </span><span>// compress same character</span></div></div><div><div><div>10</div></div><div><span>            </span><span>while</span><span><span> (index </span><span>&lt;</span><span> </span></span><span>chars</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> chars[index] </span><span>==</span><span> currentChar) {</span></span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>index++;</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>count++;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>            </span><span>// add current char to array</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>chars[result] </span><span>=</span><span> currentChar;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>result++;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>// convert count to string format then add</span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span><span> (count </span><span>!=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>                </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>Integer</span><span>.</span><span>toString</span><span>(count).</span><span>toCharArray</span><span>())  {</span></div></div><div><div><div>22</div></div><div><span><span>                    </span></span><span>chars[result] </span><span>=</span><span> c;</span></div></div><div><div><div>23</div></div><div><span><span>                    </span></span><span>result++;</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>444. Sequence Reconstruction<a href="#444-sequence-reconstruction"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sequence-reconstruction/" target="_blank">https://leetcode.com/problems/sequence-reconstruction/</a></p><hr /><p>使用一个数组<code>index</code>记录下<code>nums</code>中每个元素的下标。之后遍历<code>seqs</code>中的每个list，进行如下检查：</p><ol>
<li>list中的每个数必须在<code>[1, n]</code>的范围内</li>
<li>任意list中，前一个数在<code>nums</code>中的下标必须小于后一个数在<code>nums</code>中的下标，保证拓扑序的一致性</li>
<li>如果前一个数在<code>nums</code>中的下标 + 1为后一个数在<code>nums</code>中的下标，便能够保证这两个数的拓扑序的唯一性。必须保证所有相邻两数之间都能满足这一拓扑序的唯一性，才能最终覆盖序列的所有数</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>sequenceReconstruction</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>seqs</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (seqs </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>seqs</span><span>.</span><span>size</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>boolean</span><span><span>[] </span><span>covered</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span><span>[len </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// for each element in nums, record its index</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[len </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>index[nums[i]] </span><span>=</span><span> i;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>for</span><span> (</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>list</span><span> </span></span><span>:</span><span> seqs) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>list</span><span>.</span><span>size</span><span>(); i++) {</span></div></div><div><div><div>17</div></div><div><span>                </span><span>int</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>list</span><span>.</span><span>get</span><span>(i);</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>                </span><span>// each number should be in the range of [1, n]</span></div></div><div><div><div>20</div></div><div><span>                </span><span>if</span><span><span> (cur </span><span>&lt;</span><span> </span></span><span>1</span><span><span> </span><span>||</span><span> cur </span><span>&gt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>                </span><span>// previous element must appear before current element in nums</span></div></div><div><div><div>25</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>                    </span><span>continue</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>                </span><span>int</span><span><span> </span><span>prev</span><span> </span></span><span><span>=</span><span> </span></span><span>list</span><span>.</span><span>get</span><span><span>(i </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>29</div></div><div><span>                </span><span>if</span><span><span> (index[prev] </span><span>&gt;=</span><span> index[cur]) {</span></span></div></div><div><div><div>30</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>                </span><span>// ensure one-by-one order in index</span></div></div><div><div><div>34</div></div><div><span>                </span><span>if</span><span><span> (</span><span>!</span><span>covered[prev] </span><span>&amp;&amp;</span><span> index[prev] </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>==</span><span> index[cur]) {</span></span></div></div><div><div><div>35</div></div><div><span><span>                    </span></span><span>covered[prev] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>// must cover all numbers</span></div></div><div><div><div>41</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>42</div></div><div><span>            </span><span>if</span><span><span> (covered[nums[i]] </span><span>==</span><span> </span></span><span>false</span><span>) {</span></div></div><div><div><div>43</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>445. Add Two Numbers II<a href="#445-add-two-numbers-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/add-two-numbers-ii/" target="_blank">https://leetcode.com/problems/add-two-numbers-ii/</a></p><hr /><p>由于限制不能反转链表，因此只能从高位开始按顺序递归累加。先提前获取两个链表的长度，确保能先从长的链表开始遍历，每完成一次遍历，更新两个链表的长度差，判断此时长链表是否与短链表的最高位齐平。遍历的时候有两种情况：</p><ul>
<li>单独遍历长链表节点时，节点的值由长链表节点的值 + 进位组成。</li>
<li>同时遍历双链表节点时，节点的值由两个链表节点的值 + 进位组成</li>
</ul><p>当前位调用递归的时候，能够获取后面所有位数的结果<code>post</code>，并同时携带了进位信息。注意，进位信息保存在<code>post</code>的最前一个节点，并不需要额外用一个变量储存。同理，全部递归完成后，处理第一个节点的进位也是用相同的方法。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for singly-linked list.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class ListNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     ListNode next;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     ListNode() {}</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     ListNode(int val) { this.val = val; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>addTwoNumbers</span><span>(</span><span>ListNode</span><span><span> </span><span>l1</span><span>, </span></span><span>ListNode</span><span><span> </span><span>l2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span> </span><span>size1</span><span> </span></span><span><span>=</span><span> </span></span><span>getListLength</span><span>(l1);</span></div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span> </span><span>size2</span><span> </span></span><span><span>=</span><span> </span></span><span>getListLength</span><span>(l2);</span></div></div><div><div><div>15</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>head</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>1</span><span>);</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// make sure l1.length &gt;= l2.length</span></div></div><div><div><div>18</div></div><div><span>        </span><span>head</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> size1 </span><span>&lt;</span><span> size2 </span></span><span>?</span><span> </span><span>helper</span><span><span>(l2, l1, size2 </span><span>-</span><span> size1) </span></span><span>:</span><span> </span><span>helper</span><span><span>(l1, l2, size1 </span><span>-</span><span> size2);</span></span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// handle the first digit</span></div></div><div><div><div>21</div></div><div><span>        </span><span>if</span><span> (</span><span>head</span><span>.</span><span>next</span><span>.</span><span>val</span><span><span> </span><span>&gt;</span><span> </span></span><span>9</span><span>) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>head</span><span>.</span><span>next</span><span>.</span><span>val</span><span><span> </span><span>=</span><span> </span></span><span>head</span><span>.</span><span>next</span><span>.</span><span>val</span><span><span> </span><span>%</span><span> </span></span><span>10</span><span>;</span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span> head;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> </span><span>head</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>getListLength</span><span>(</span><span>ListNode</span><span><span> </span><span>l</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>30</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>31</div></div><div><span>        </span><span>while</span><span><span> (l </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>l </span><span>=</span><span> </span><span>l</span><span>.</span><span>next</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>len++;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>        </span><span>return</span><span> len;</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>    </span><span>public</span><span> </span><span>ListNode</span><span> </span><span>helper</span><span>(</span><span>ListNode</span><span><span> </span><span>l1</span><span>, </span></span><span>ListNode</span><span><span> </span><span>l2</span><span>, </span></span><span>int</span><span><span> </span><span>lenDiff</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>39</div></div><div><span>        </span><span>if</span><span><span> (l1 </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>40</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>current</span><span> </span></span><span><span>=</span><span> lenDiff </span><span>==</span><span> </span></span><span>0</span><span> </span><span>?</span><span> </span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>l1</span><span>.</span><span>val</span><span><span> </span><span>+</span><span> </span></span><span>l2</span><span>.</span><span>val</span><span>) </span><span>:</span><span> </span><span>new</span><span> </span><span>ListNode</span><span>(</span><span>l1</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>44</div></div><div><span>        </span><span>ListNode</span><span><span> </span><span>post</span><span> </span></span><span><span>=</span><span> lenDiff </span><span>==</span><span> </span></span><span>0</span><span> </span><span>?</span><span> </span><span>helper</span><span>(</span><span>l1</span><span>.</span><span>next</span><span>, </span><span>l2</span><span>.</span><span>next</span><span>, </span><span>0</span><span>) </span><span>:</span><span> </span><span>helper</span><span>(</span><span>l1</span><span>.</span><span>next</span><span><span>, l2, lenDiff </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>        </span><span>// handle carry</span></div></div><div><div><div>47</div></div><div><span>        </span><span>if</span><span><span> (post </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>post</span><span>.</span><span>val</span><span><span> </span><span>&gt;</span><span> </span></span><span>9</span><span>) {</span></div></div><div><div><div>48</div></div><div><span>            </span><span>current</span><span>.</span><span>val</span><span><span> </span><span>+=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>49</div></div><div><span>            </span><span>post</span><span>.</span><span>val</span><span><span> </span><span>=</span><span> </span></span><span>post</span><span>.</span><span>val</span><span><span> </span><span>%</span><span> </span></span><span>10</span><span>;</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>        </span><span>current</span><span>.</span><span>next</span><span><span> </span><span>=</span><span> post;</span></span></div></div><div><div><div>53</div></div><div><span>        </span><span>return</span><span> current;</span></div></div><div><div><div>54</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>446. Arithmetic Slices II - Subsequence<a href="#446-arithmetic-slices-ii---subsequence"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/arithmetic-slices-ii-subsequence/" target="_blank">https://leetcode.com/problems/arithmetic-slices-ii-subsequence/</a></p><hr /><p>使用二维<code>dp</code>，其中<code>dp[i][j]</code>表示包含<code>dp[i]</code>和<code>dp[j]</code>的arithmetic序列个数。遍历数组，记录每一个数出现的下标，并把所有下标归类到一个链表中，再把&lt;下标, 链表&gt;映射以HashMap形式存储。之后双重循环，锁定<code>i</code>和<code>j</code>，利用<code>A[k] - A[i] = A[i] - A[j] (k &lt; i &lt; j)</code>这个性质，从HashMap中查找是否存在合适的<code>k</code>值。如果存在，<code>dp[i][j]</code>值的就在<code>dp[k][i]</code>的基础上 + 1，表示新增了一个arithmetic序列。每次完成循环后，当前<code>dp[i][j]</code>新加的值就统计到总的结果中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>numberOfArithmeticSlices</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n][n];</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Long</span><span>, </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>();</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>8</div></div><div><span>            </span><span>map</span><span>.</span><span>putIfAbsent</span><span>((</span><span>long</span><span>)nums[i], </span><span>new</span><span> </span><span>ArrayList</span><span>());</span></div></div><div><div><div>9</div></div><div><span>            </span><span>map</span><span>.</span><span>get</span><span>((</span><span>long</span><span>)nums[i]).</span><span>add</span><span>(i);</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>14</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i </span><span>+</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;</span><span> n; j++) {</span></span></div></div><div><div><div>15</div></div><div><span>                </span><span>long</span><span><span> </span><span>target</span><span> </span></span><span><span>=</span><span> </span></span><span>2</span><span><span> </span><span>*</span><span> (</span></span><span>long</span><span><span>) nums[i] </span><span>-</span><span> nums[j];</span></span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>                </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span>(target)) {</span></div></div><div><div><div>18</div></div><div><span>                    </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span>:</span><span> </span><span>map</span><span>.</span><span>get</span><span>(target)) {</span></div></div><div><div><div>19</div></div><div><span>                        </span><span>if</span><span><span> (k </span><span>&lt;</span><span> i) {</span></span></div></div><div><div><div>20</div></div><div><span><span>                            </span></span><span>dp[i][j] </span><span>+=</span><span> (dp[k][i] </span><span>+</span><span> </span><span>1</span><span>);</span></div></div><div><div><div>21</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> dp[i][j];</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>447. Number of Boomerangs<a href="#447-number-of-boomerangs"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/number-of-boomerangs/" target="_blank">https://leetcode.com/problems/number-of-boomerangs/</a></p><hr /><p>双重循环，两两判断点之间点的距离，固定<code>i</code>并得到当前<code>points[i]</code>和<code>points[j]</code>之间的距离，通过<code>hashmap.merge()</code>方法得到这一轮<code>i</code>循环中这个距离出现的次数，如果已经出现了<code>distCount</code>次，组合数增加就要增加<code>distCount - 1</code>（相当于在加入当前这段距离之前，原来的重复距离每一个都要跟新加入的距离组成配对）。由于每个组合内后两个点顺序可以互换，因此最后总的结果还要乘2。</p><p>注意，这里的<code>hashmap.merge()</code>方法作用是依照BiFunction，替换更新key对应的value。在本题中，其时间复杂度是O(1)，因为BiFunction是两数求和，而其余的合并底层操作，比如get和remove等也都是O(1)。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>numberOfBoomerangs</span><span>(</span><span>int</span><span><span>[][] </span><span>points</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>points</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>points</span><span>.</span><span>length</span><span>; j++) {</span></div></div><div><div><div>8</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>==</span><span> j) {</span></span></div></div><div><div><div>9</div></div><div><span>                    </span><span>continue</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>                </span><span>// count of current distance between two points</span></div></div><div><div><div>13</div></div><div><span>                </span><span>int</span><span><span> </span><span>distCount</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>merge</span><span>(</span><span>getDist</span><span>(points[i], points[j]), </span><span>1</span><span>, Integer</span><span>::</span><span>sum);</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>                </span><span>// shake hand rules</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> distCount </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>map</span><span>.</span><span>clear</span><span>();</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// double order, double result</span></div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span><span> result </span><span>*</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>getDist</span><span>(</span><span>int</span><span><span> </span><span>a</span><span>[], </span></span><span>int</span><span><span> </span><span>b</span><span>[])</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> (a[</span><span>0</span><span><span>] </span><span>-</span><span> b[</span></span><span>0</span><span><span>])</span><span>*</span><span>(a[</span></span><span>0</span><span><span>] </span><span>-</span><span> b[</span></span><span>0</span><span><span>]) </span><span>+</span><span> (a[</span></span><span>1</span><span><span>] </span><span>-</span><span> b[</span></span><span>1</span><span><span>])</span><span>*</span><span>(a[</span></span><span>1</span><span><span>] </span><span>-</span><span> b[</span></span><span>1</span><span>]);</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>448. Find All Numbers Disappeared in an Array<a href="#448-find-all-numbers-disappeared-in-an-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/" target="_blank">https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/</a></p><hr /><p>两次循环，第一次循环访问每个数对应的下标，把下标位置上对应的数加上<code>n</code>。第二次循环直接顺序检查每个下标，如果当前下标对应的值小于<code>n</code>，说明之前并没有被访问修改过，因此说明数组中并不存在对应的数字来跳转访问这个下标。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>findDisappearedNumbers</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// modify original number and add n</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>nums[(nums[i]</span><span>-</span><span>1</span><span><span>) </span><span>%</span><span> n] </span><span>+=</span><span> n;</span></span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>// numbers still less than n are disappeared</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span><span> (nums[i] </span><span>&lt;=</span><span> n) {</span></span></div></div><div><div><div>14</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span><span>(i</span><span>+</span></span><span>1</span><span>);</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>449. Serialize and Deserialize BST<a href="#449-serialize-and-deserialize-bst"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/serialize-and-deserialize-bst/" target="_blank">https://leetcode.com/problems/serialize-and-deserialize-bst/</a></p><hr /><p>依然是前序遍历编码解码的思想。由于要求编码的结果尽可能紧凑，可以将null的值压缩成<code>n</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode(int x) { val = x; }</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>10</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Codec</span><span> </span></span><span>{</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span>// Encodes a tree to a single string.</span></div></div><div><div><div>13</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>serialize</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>15</div></div><div><span>        </span><span>serializeHelper</span><span>(root, sb);</span></div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>serializeHelper</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>, </span></span><span>StringBuilder</span><span><span> </span><span>sb</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>"n,"</span><span>);</span></div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>        </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>node</span><span>.</span><span>val</span><span>).</span><span>append</span><span>(</span><span>","</span><span>);</span></div></div><div><div><div>25</div></div><div><span>        </span><span>serializeHelper</span><span>(</span><span>node</span><span>.</span><span>left</span><span>, sb);</span></div></div><div><div><div>26</div></div><div><span>        </span><span>serializeHelper</span><span>(</span><span>node</span><span>.</span><span>right</span><span>, sb);</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>    </span><span>// Decodes your encoded data to tree.</span></div></div><div><div><div>30</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>deserialize</span><span>(</span><span>String</span><span><span> </span><span>data</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>nodes</span><span> </span></span><span><span>=</span><span> </span></span><span>data</span><span>.</span><span>split</span><span>(</span><span>","</span><span>);</span></div></div><div><div><div>32</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>1</span><span>];</span></div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span> </span><span>deserializeHelper</span><span>(nodes, index);</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>    </span><span>private</span><span> </span><span>TreeNode</span><span> </span><span>deserializeHelper</span><span>(</span><span>String</span><span><span>[] </span><span>nodes</span><span>, </span></span><span>int</span><span><span>[] </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>36</div></div><div><span>        </span><span>if</span><span> (nodes[index[</span><span>0</span><span>]].</span><span>equals</span><span>(</span><span>"n"</span><span>)) {</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>index[</span><span>0</span><span>]++;</span></div></div><div><div><div>38</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeNode</span><span>(</span><span>Integer</span><span>.</span><span>valueOf</span><span>(nodes[index[</span><span>0</span><span>]]));</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>index[</span><span>0</span><span>]++;</span></div></div><div><div><div>42</div></div><div><span>        </span><span>cur</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>deserializeHelper</span><span>(nodes, index);</span></div></div><div><div><div>43</div></div><div><span>        </span><span>cur</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>deserializeHelper</span><span>(nodes, index);</span></div></div><div><div><div>44</div></div><div><span>        </span><span>return</span><span> cur;</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span>}</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span>// Your Codec object will be instantiated and called as such:</span></div></div><div><div><div>49</div></div><div><span>// Codec ser = new Codec();</span></div></div><div><div><div>50</div></div><div><span>// Codec deser = new Codec();</span></div></div><div><div><div>51</div></div><div><span>// String tree = ser.serialize(root);</span></div></div><div><div><div>52</div></div><div><span>// TreeNode ans = deser.deserialize(tree);</span></div></div><div><div><div>53</div></div><div><span>// return ans;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>450. Delete Node in a BST<a href="#450-delete-node-in-a-bst"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/delete-node-in-a-bst/" target="_blank">https://leetcode.com/problems/delete-node-in-a-bst/</a></p><hr /><p>找到目标节点，从右子树中找到最小的节点进行替换。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>deleteNode</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>, </span></span><span>int</span><span><span> </span><span>key</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> root;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// Search in subtrees</span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>val</span><span><span> </span><span>&lt;</span><span> key) {</span></span></div></div><div><div><div>24</div></div><div><span>            </span><span>root</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>deleteNode</span><span>(</span><span>root</span><span>.</span><span>right</span><span>, key);</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span> root;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>root</span><span>.</span><span>val</span><span><span> </span><span>&gt;</span><span> key) {</span></span></div></div><div><div><div>27</div></div><div><span>            </span><span>root</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>deleteNode</span><span>(</span><span>root</span><span>.</span><span>left</span><span>, key);</span></div></div><div><div><div>28</div></div><div><span>            </span><span>return</span><span> root;</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>// No child or only one child</span></div></div><div><div><div>32</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>root</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>33</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>root</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>35</div></div><div><span>            </span><span>return</span><span> </span><span>root</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>root</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>37</div></div><div><span>            </span><span>return</span><span> </span><span>root</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>// Two children</span></div></div><div><div><div>41</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>right</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>42</div></div><div><span>            </span><span>root</span><span>.</span><span>right</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>root</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>43</div></div><div><span>            </span><span>return</span><span> </span><span>root</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>45</div></div><div><span>            </span><span>TreeNode</span><span><span> </span><span>smallest</span><span> </span></span><span><span>=</span><span> </span></span><span>deleteSmallest</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>46</div></div><div><span>            </span><span>smallest</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>root</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>47</div></div><div><span>            </span><span>smallest</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>root</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>48</div></div><div><span>            </span><span>return</span><span> smallest;</span></div></div><div><div><div>49</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>    </span><span>// Find the smallest node in right subtree and delete it</span></div></div><div><div><div>53</div></div><div><span>    </span><span>private</span><span> </span><span>TreeNode</span><span> </span><span>deleteSmallest</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>54</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>root</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>55</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>pre</span><span> </span></span><span><span>=</span><span> root;</span></span></div></div><div><div><div>56</div></div><div><span>        </span><span>while</span><span> (</span><span>cur</span><span>.</span><span>left</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>57</div></div><div><span><span>            </span></span><span>pre </span><span>=</span><span> cur;</span></div></div><div><div><div>58</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>59</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>60</div></div><div><span>        </span><span>pre</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>cur</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>61</div></div><div><span>        </span><span>return</span><span> cur;</span></div></div><div><div><div>62</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>63</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>451. Sort Characters By Frequency<a href="#451-sort-characters-by-frequency"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sort-characters-by-frequency/" target="_blank">https://leetcode.com/problems/sort-characters-by-frequency/</a></p><hr /><p>存储<code>&lt;character, frequency&gt;</code>map序列并按照<code>frequency</code>降序排序，之后按照顺序输出每个字符即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>frequencySort</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>128</span><span>];</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>s</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>map[c]++;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// insert &lt;character, frequency&gt; into a priority queue, with descending frequency order</span></div></div><div><div><div>10</div></div><div><span>        </span><span>PriorityQueue</span><span>&lt;</span><span>int</span><span><span>[]&gt; </span><span>q</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;&gt;((a, b) </span><span>-&gt;</span><span> b[</span><span>1</span><span><span>] </span><span>-</span><span> a[</span></span><span>1</span><span>]);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// insert only if the char is present in input string</span></div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>128</span><span>; i++) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span><span> (map[i] </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>q</span><span>.</span><span>offer</span><span>(</span><span>new</span><span> </span><span>int</span><span>[] {i, map[i]});</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[</span><span>s</span><span>.</span><span>length</span><span>()];</span></div></div><div><div><div>20</div></div><div><span>        </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>// output characters from queue</span></div></div><div><div><div>23</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>q</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>int</span><span><span>[] </span><span>entry</span><span> </span></span><span><span>=</span><span> </span></span><span>q</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>25</div></div><div><span>            </span><span>char</span><span><span> </span><span>letter</span><span> </span></span><span><span>=</span><span> (</span></span><span>char</span><span>) entry[</span><span>0</span><span>];</span></div></div><div><div><div>26</div></div><div><span>            </span><span>int</span><span><span> </span><span>frequency</span><span> </span></span><span><span>=</span><span> entry[</span></span><span>1</span><span>];</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> frequency; i++) {</span></span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>result[index] </span><span>=</span><span> letter;</span></div></div><div><div><div>30</div></div><div><span><span>                </span></span><span>index++;</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>return</span><span> </span><span>String</span><span>.</span><span>valueOf</span><span>(result);</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>452. Minimum Number of Arrows to Burst Balloons<a href="#452-minimum-number-of-arrows-to-burst-balloons"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/" target="_blank">https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/</a></p><hr /><p>本质上是区间合并问题的变种，先按照x<sub>end</sub>对每个区间进行排序，之后遍历，如果相邻两个区间没有重叠，就说明这两个区间一定需要2箭分别穿过，总的箭数量+1；反之说明两个区间可以合并，用1箭穿过。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findMinArrowShots</span><span>(</span><span>int</span><span><span>[][] </span><span>points</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (points </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>points</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// sort by x-end coordinate</span></div></div><div><div><div>8</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(points, (a, b) </span><span>-&gt;</span><span> { </span><span>return</span><span> a[</span><span>1</span><span><span>] </span><span>==</span><span> b[</span></span><span>1</span><span>] </span><span>?</span><span> </span><span>0</span><span> </span><span>:</span><span> a[</span><span>1</span><span><span>] </span><span>&gt;</span><span> b[</span></span><span>1</span><span>] </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span><span> </span><span>-</span></span><span>1</span><span>; });</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>curEnd</span><span> </span></span><span><span>=</span><span> points[</span></span><span>0</span><span>][</span><span>1</span><span>];</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>points</span><span>.</span><span>length</span><span>;) {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>// need another arrow to shoot</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span> (points[i][</span><span>0</span><span><span>] </span><span>&gt;</span><span> curEnd) {</span></span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>curEnd </span><span>=</span><span> points[i][</span><span>1</span><span>];</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>result++;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>18</div></div><div><span>                </span><span>// two balloons can be shot with one arrow, merge them</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>453. Minimum Moves to Equal Array Elements<a href="#453-minimum-moves-to-equal-array-elements"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minimum-moves-to-equal-array-elements/" target="_blank">https://leetcode.com/problems/minimum-moves-to-equal-array-elements/</a></p><hr /><p><code>n - 1</code>个数增大1，等同于1个数减少1。因此只要找出数组最小值，再计算其他每个数跟最小值的差值总和是多少即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minMoves</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// find minimum value of the array</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>min</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>n</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>min </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(min, n);</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>// n - 1 number increment by 1 = 1 number decrement by 1, and all numbers should match with minimum value</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> nums[i] </span><span>-</span><span> min;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>454. 4Sum II<a href="#454-4sum-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/4sum-ii/" target="_blank">https://leetcode.com/problems/4sum-ii/</a></p><hr /><p>对4sum进行拆分，先算出<code>nums1</code>、<code>nums2</code>中两两组合能得到的所有<code>sum</code>，并统计每个<code>sum</code>出现的个数，把结果存到map中。再遍历<code>nums3</code>、<code>nums4</code>中所有的两两组合，如果发现map中有对应的key（负值），说明当前4个数字能组成4sum为0的组合。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>fourSumCount</span><span>(</span><span>int</span><span><span>[] </span><span>nums1</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums2</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums3</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums4</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums1 </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums1</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> nums2 </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums2</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span></span></div></div><div><div><div>4</div></div><div><span><span>            </span></span><span>nums3 </span><span>==</span><span> </span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums3</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> nums4 </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums4</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>                </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>nums1</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>// &lt;sum of two numbers, count&gt;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>15</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> len; j++) {</span></span></div></div><div><div><div>16</div></div><div><span>                </span><span>map</span><span>.</span><span>compute</span><span><span>(nums1[i] </span><span>+</span><span> nums2[j], (k, v) </span></span><span>-&gt;</span><span><span> v </span><span>==</span><span> </span></span><span>null</span><span> </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span><span> v </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> len; i++) {</span></span></div></div><div><div><div>21</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> len; j++) {</span></span></div></div><div><div><div>22</div></div><div><span>                </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span><span>(</span><span>-</span><span>(nums3[i] </span><span>+</span><span> nums4[j]))) {</span></span></div></div><div><div><div>23</div></div><div><span><span>                    </span></span><span>result </span><span>+=</span><span> </span><span>map</span><span>.</span><span>get</span><span><span>(</span><span>-</span><span>(nums3[i] </span><span>+</span><span> nums4[j]));</span></span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>455. Assign Cookies<a href="#455-assign-cookies"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/assign-cookies/" target="_blank">https://leetcode.com/problems/assign-cookies/</a></p><hr /><p>先对两个数组进行排序。遍历<code>s</code>，总是尝试用当前最小<code>size</code>的饼干去满足当前的小孩，如果能满足的话，小孩个数+1。无论是否成功满足，都必须遍历下一块饼干。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findContentChildren</span><span>(</span><span>int</span><span><span>[] </span><span>g</span><span>, </span></span><span>int</span><span><span>[] </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(g);</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(s);</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; result </span><span>&lt;</span><span> </span></span><span>g</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> i </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>// always try to use the minimum size to satisfy current child</span></div></div><div><div><div>9</div></div><div><span>            </span><span>if</span><span><span> (g[result] </span><span>&lt;=</span><span> s[i]) {</span></span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>result++;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>456. 132 Pattern<a href="#456-132-pattern"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/132-pattern/" target="_blank">https://leetcode.com/problems/132-pattern/</a></p><hr /><p>单调栈，从数组右侧开始遍历，如果当前数<code>nums[i]</code>比栈顶的元素更大，就把栈顶所有小于等于<code>nums[i]</code>的数弹出，弹出的数作为<code>s3</code> candidate，而栈顶作为<code>s2</code> candidate。这一步的目的是确保<code>s2 &gt; s3</code>。在这个前提下，如果又能在遍历时发现<code>nums[i] &lt; s3</code>，则说明<code>nums[i]</code>是合适的<code>s1</code> candidate。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>find132pattern</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>s3</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>stack</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span><span> (nums[i] </span><span>&lt;</span><span> s3) {</span></span></div></div><div><div><div>8</div></div><div><span>                </span><span>// num[i] is s1 candidate</span></div></div><div><div><div>9</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>11</div></div><div><span>                </span><span>// pop out all stack top numbers that are smaller than nums[i]. Left numbers are s2 candidates</span></div></div><div><div><div>12</div></div><div><span>                </span><span>while</span><span><span> (</span><span>!</span></span><span>stack</span><span>.</span><span>isEmpty</span><span><span>() </span><span>&amp;&amp;</span><span> nums[i] </span><span>&gt;</span><span> </span></span><span>stack</span><span>.</span><span>peek</span><span>()) {</span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>s3 </span><span>=</span><span> </span><span>stack</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>                </span><span>stack</span><span>.</span><span>push</span><span>(nums[i]);</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>457. Circular Array Loop<a href="#457-circular-array-loop"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/circular-array-loop/" target="_blank">https://leetcode.com/problems/circular-array-loop/</a></p><hr /><p>用DFS，维护每个元素的访问状态，转化为DFS检测环问题。注意需排除长度为1，以及包含前后movement的情况。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> NOT_VISITED </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> VISITING </span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> VISITED </span><span><span>=</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>circularArrayLoop</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>N</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>visited</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[N];</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> N; i++) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span><span> (visited[i] </span><span>==</span><span> NOT_VISITED </span><span>&amp;&amp;</span><span> </span></span><span>dfs</span><span>(i, visited, nums)) {</span></div></div><div><div><div>11</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>    </span><span>// return true if there is a cycle</span></div></div><div><div><div>19</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span> </span><span>cur</span><span>, </span></span><span>int</span><span><span>[] </span><span>visited</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>int</span><span><span> </span><span>N</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>21</div></div><div><span>        </span><span>if</span><span><span> (visited[cur] </span><span>==</span><span> VISITING) {</span></span></div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (visited[cur] </span><span>==</span><span> VISITED) {</span></span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>visited[cur] </span><span>=</span><span> VISITING;</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>int</span><span><span> </span><span>next</span><span> </span></span><span><span>=</span><span> cur </span><span>+</span><span> nums[cur];</span></span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>next </span><span>%=</span><span> N;</span></div></div><div><div><div>32</div></div><div><span>        </span><span>if</span><span><span> (next </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>next </span><span>+=</span><span> N;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>// invalid cycle if the length is 1, or it consists of forward and backward movement</span></div></div><div><div><div>37</div></div><div><span>        </span><span>if</span><span><span> (next </span><span>==</span><span> cur </span><span>||</span><span> nums[next] </span><span>*</span><span> nums[cur] </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>visited[cur] </span><span>=</span><span> VISITED;</span></div></div><div><div><div>39</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>if</span><span> (</span><span>dfs</span><span>(next, visited, nums)) {</span></div></div><div><div><div>43</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span><span>        </span></span><span>visited[cur] </span><span>=</span><span> VISITED;</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>458. Poor Pigs<a href="#458-poor-pigs"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/poor-pigs/" target="_blank">https://leetcode.com/problems/poor-pigs/</a></p><hr /><p>需要至少<code>minutesToTest / minutesToDie + 1</code>轮测试，每一轮测试中的每只猪都要能覆盖到一些<code>bucket</code>，必须要保证通过全部的测试，所有的<code>bucket</code>都被覆盖到。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>poorPigs</span><span>(</span><span>int</span><span><span> </span><span>buckets</span><span>, </span></span><span>int</span><span><span> </span><span>minutesToDie</span><span>, </span></span><span>int</span><span><span> </span><span>minutesToTest</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>while</span><span> (</span><span>Math</span><span>.</span><span>pow</span><span><span>(minutesToTest </span><span>/</span><span> minutesToDie </span><span>+</span><span> </span></span><span>1</span><span><span>, result) </span><span>&lt;</span><span> buckets) {</span></span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>459. Repeated Substring Pattern<a href="#459-repeated-substring-pattern"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/repeated-substring-pattern/" target="_blank">https://leetcode.com/problems/repeated-substring-pattern/</a></p><hr /><p>从输入字符串的中间开始，向前遍历到能整除字符串长度的下标，因为这个下标可能是重复<code>pattern</code>的结尾。之后双指针向前移动，确保双指针经过的内容完全一致，直到右指针到达字符串终点。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>repeatedSubstringPattern</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>char</span><span><span> [] </span><span>chars</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>chars</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> len </span><span>/</span><span> </span></span><span>2</span><span><span>; i </span><span>&gt;</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>// potential pattern start</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (len </span><span>%</span><span> i </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>                </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div><span>                </span><span>int</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> i;</span></span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>                </span><span>// should always match</span></div></div><div><div><div>13</div></div><div><span>                </span><span>while</span><span><span> (right </span><span>&lt;</span><span> len </span><span>&amp;&amp;</span><span> chars[left] </span><span>==</span><span> chars[right]) {</span></span></div></div><div><div><div>14</div></div><div><span><span>                    </span></span><span>left++;</span></div></div><div><div><div>15</div></div><div><span><span>                    </span></span><span>right++;</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>                </span><span>if</span><span><span> (right </span><span>==</span><span> len) {</span></span></div></div><div><div><div>19</div></div><div><span>                    </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>460. LFU Cache<a href="#460-lfu-cache"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/lfu-cache/" target="_blank">https://leetcode.com/problems/lfu-cache/</a></p><hr /><p>维护3个HashMap，第一个<code>keyToVal</code>用于存储每个输入的<code>(key, value)</code>对；第二个<code>keyToCount</code>用于存储每个<code>key</code>被使用了几次；第三个<code>countToLRUKeys</code>用于存储对于每个使用次数<code>count</code>，分别有哪些<code>key</code>被使用了这么多次，相同使用次数的<code>key</code>用一个HashSet存在一起。</p><p>put新的<code>(key, value)</code>时，首先确保<code>capacity</code>有效。之后讨论情况：</p><ul>
<li>如果当前<code>key</code>已经存在，则覆盖原来<code>keyToVal</code>保存的值，直接返回</li>
<li>如果这个<code>key不</code>存在，并且已经没有空余位置，需要从当前使用次数最少的<code>key</code>中踢掉一个，注意踢的时候既要从<code>countToLRUKeys</code>，也要从<code>keyToVal</code>踢，踢完之后，更新<code>keyToVal</code>，并且注意此时的最小使用<code>count</code>一定是1（要么是新<code>key</code>，要么之前的最小值就是1），在这个基础上更新<code>keyToCount</code>和<code>countToLRUKeys</code>。</li>
</ul><p><code>get(key)</code>时，先确保key在<code>keyToVal</code>中存在。之后从<code>countToLRUKeys</code>中移除掉自己的记录（因为自己的<code>count + 1</code>了），再看情况决定是否需要更新<code>min</code>。最后更新<code>keyToCount</code>，返回<code>keyToVal</code>的取值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>LFUCache</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> min</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> capacity</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>HashMap</span><span>&lt;</span><span>Integer</span><span><span>,</span><span> </span></span><span>Integer</span><span><span>&gt;</span><span> keyToVal</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>private</span><span> </span><span>HashMap</span><span>&lt;</span><span>Integer</span><span><span>,</span><span> </span></span><span>Integer</span><span><span>&gt;</span><span> keyToCount</span></span><span>;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>private</span><span> </span><span>HashMap</span><span>&lt;</span><span>Integer</span><span><span>,</span><span> </span></span><span>LinkedHashSet</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> countToLRUKeys</span></span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>public</span><span> </span><span>LFUCache</span><span>(</span><span>int</span><span><span> </span><span>capacity</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span>        </span><span>this</span><span>.</span><span>min</span><span><span> </span><span>=</span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>this</span><span>.</span><span>capacity</span><span><span> </span><span>=</span><span> capacity;</span></span></div></div><div><div><div>11</div></div><div><span>        </span><span>this</span><span>.</span><span>keyToVal</span><span><span> </span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>12</div></div><div><span>        </span><span>this</span><span>.</span><span>keyToCount</span><span><span> </span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>13</div></div><div><span>        </span><span>this</span><span>.</span><span>countToLRUKeys</span><span><span> </span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>get</span><span>(</span><span>int</span><span><span> </span><span>key</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>17</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>keyToVal</span><span>.</span><span>containsKey</span><span>(key)) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>keyToCount</span><span>.</span><span>get</span><span>(key);</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>// remove key from current count (since we will increase count)</span></div></div><div><div><div>24</div></div><div><span>        </span><span>countToLRUKeys</span><span>.</span><span>get</span><span>(count).</span><span>remove</span><span>(key);</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>// no element is of min count</span></div></div><div><div><div>27</div></div><div><span>        </span><span>if</span><span><span> (count </span><span>==</span><span> min </span><span>&amp;&amp;</span><span> </span></span><span>countToLRUKeys</span><span>.</span><span>get</span><span>(count).</span><span>size</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>min++;</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>updateCount</span><span><span>(key, count </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>32</div></div><div><span>        </span><span>return</span><span> </span><span>keyToVal</span><span>.</span><span>get</span><span>(key);</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>put</span><span>(</span><span>int</span><span><span> </span><span>key</span><span>, </span></span><span>int</span><span><span> </span><span>value</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>36</div></div><div><span>        </span><span>if</span><span><span> (capacity </span><span>&lt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>37</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>if</span><span> (</span><span>keyToVal</span><span>.</span><span>containsKey</span><span>(key)) {</span></div></div><div><div><div>41</div></div><div><span>            </span><span>// update key's value</span></div></div><div><div><div>42</div></div><div><span>            </span><span>keyToVal</span><span>.</span><span>put</span><span>(key, value);</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>            </span><span>// update key's count</span></div></div><div><div><div>45</div></div><div><span>            </span><span>get</span><span>(key);</span></div></div><div><div><div>46</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>        </span><span>// new element and no enough space, evict LRU from this min count bucket</span></div></div><div><div><div>50</div></div><div><span>        </span><span>if</span><span> (</span><span>keyToVal</span><span>.</span><span>size</span><span><span>() </span><span>&gt;=</span><span> capacity) {</span></span></div></div><div><div><div>51</div></div><div><span>            </span><span>int</span><span><span> </span><span>evictKey</span><span> </span></span><span><span>=</span><span> </span></span><span>countToLRUKeys</span><span>.</span><span>get</span><span>(min).</span><span>iterator</span><span>().</span><span>next</span><span>();</span></div></div><div><div><div>52</div></div><div><span>            </span><span>countToLRUKeys</span><span>.</span><span>get</span><span>(min).</span><span>remove</span><span>(evictKey);</span></div></div><div><div><div>53</div></div><div><span>            </span><span>keyToVal</span><span>.</span><span>remove</span><span>(evictKey);</span></div></div><div><div><div>54</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>        </span><span>// adding new key and value</span></div></div><div><div><div>57</div></div><div><span>        </span><span>keyToVal</span><span>.</span><span>put</span><span>(key, value);</span></div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span>        </span><span>// min count must be 1 now</span></div></div><div><div><div>60</div></div><div><span><span>        </span></span><span>min </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>61</div></div><div>
</div></div><div><div><div>62</div></div><div><span>        </span><span>// adding new key and min count</span></div></div><div><div><div>63</div></div><div><span>        </span><span>updateCount</span><span>(key, min);</span></div></div><div><div><div>64</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>65</div></div><div>
</div></div><div><div><div>66</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>updateCount</span><span>(</span><span>int</span><span><span> </span><span>key</span><span>, </span></span><span>int</span><span><span> </span><span>count</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>67</div></div><div><span>        </span><span>keyToCount</span><span>.</span><span>put</span><span>(key, count);</span></div></div><div><div><div>68</div></div><div><span>        </span><span>if</span><span><span> (</span><span>!</span></span><span>countToLRUKeys</span><span>.</span><span>containsKey</span><span>(count)) {</span></div></div><div><div><div>69</div></div><div><span>            </span><span>countToLRUKeys</span><span>.</span><span>put</span><span>(count, </span><span>new</span><span> </span><span>LinkedHashSet</span><span>&lt;&gt;());</span></div></div><div><div><div>70</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>71</div></div><div><span>        </span><span>countToLRUKeys</span><span>.</span><span>get</span><span>(count).</span><span>add</span><span>(key);</span></div></div><div><div><div>72</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>73</div></div><div><span>}</span></div></div><div><div><div>74</div></div><div>
</div></div><div><div><div>75</div></div><div><span>/**</span></div></div><div><div><div>76</div></div><div><span><span> </span></span><span>* Your LFUCache object will be instantiated and called as such:</span></div></div><div><div><div>77</div></div><div><span><span> </span></span><span>* LFUCache obj = new LFUCache(capacity);</span></div></div><div><div><div>78</div></div><div><span><span> </span></span><span>* int param_1 = obj.get(key);</span></div></div><div><div><div>79</div></div><div><span><span> </span></span><span>* obj.put(key,value);</span></div></div><div><div><div>80</div></div><div><span><span> </span></span><span>*/</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>461. Hamming Distance<a href="#461-hamming-distance"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/hamming-distance/" target="_blank">https://leetcode.com/problems/hamming-distance/</a></p><hr /><p>要求出不同的位数，其实就是看<code>x</code>和<code>y</code>异或结果中1的个数，可以使用循环右移法，累加出1的总数。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>hammingDistance</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>xor</span><span> </span></span><span><span>=</span><span> x </span><span>^</span><span> y;</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>32</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> (xor </span><span>&gt;&gt;</span><span> i) </span><span>&amp;</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>462. Minimum Moves to Equal Array Elements II<a href="#462-minimum-moves-to-equal-array-elements-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/" target="_blank">https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/</a></p><hr /><p>将数组排序，让最大和最小的数组成一对，次大和次小的数组成一对，以此类推，累加每组数对的差值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minMoves2</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(nums);</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, j </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> j) {</span></span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>count </span><span>+=</span><span> nums[j] </span><span>-</span><span> nums[i];</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>i++;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>j--;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span> count;</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>463. Island Perimeter<a href="#463-island-perimeter"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/island-perimeter/" target="_blank">https://leetcode.com/problems/island-perimeter/</a></p><hr /><p>检查每个方格，如果是岛，先加上4的边长；之后检查这个岛的左、上是否有相邻岛，如果有相邻就减2边长，因为相邻的两个岛都不需要交界边了。为了避免重复，检查相邻岛时只需要检查左、上即可（右、下也可以）。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>islandPerimeter</span><span>(</span><span>int</span><span><span>[][] </span><span>grid</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (grid </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>grid</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> grid[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>grid</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> grid[</span></span><span>0</span><span>].</span><span>length</span><span>; j++) {</span></div></div><div><div><div>10</div></div><div><span>                </span><span>if</span><span><span> (grid[i][j] </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>11</div></div><div><span><span>                    </span></span><span>result </span><span>+=</span><span> </span><span>4</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>                    </span><span>if</span><span><span> (i </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> grid[i</span><span>-</span></span><span>1</span><span><span>][j] </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>14</div></div><div><span><span>                        </span></span><span>result </span><span>-=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>                    </span><span>if</span><span><span> (j </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> grid[i][j</span><span>-</span></span><span>1</span><span><span>] </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>17</div></div><div><span><span>                        </span></span><span>result </span><span>-=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>464. Can I Win<a href="#464-can-i-win"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/can-i-win/" target="_blank">https://leetcode.com/problems/can-i-win/</a></p><hr /><p>排除掉一些特殊情况，比如<code>desiredTotal</code>太小或者太大，或者恰好二者相差为1，其余情况使用DFS，用二进制状态码表示当前已经选择的数字，并且再推导出选择下一个数字后的新状态，逐步深入判断先手玩家能否取胜，再修改对应的DP数组。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>canIWin</span><span>(</span><span>int</span><span><span> </span><span>maxChoosableInteger</span><span>, </span></span><span>int</span><span><span> </span><span>desiredTotal</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// first player directly win</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (maxChoosableInteger </span><span>&gt;=</span><span> desiredTotal) {</span></span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (desiredTotal </span><span>&lt;=</span><span> maxChoosableInteger </span><span>*</span><span> </span></span><span>2</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>// if max + 1 = desired, first player choose x, second always choose max - x and win</span></div></div><div><div><div>8</div></div><div><span>            </span><span>return</span><span><span> maxChoosableInteger </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>!=</span><span> desiredTotal;</span></span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (maxChoosableInteger </span><span>*</span><span> (maxChoosableInteger </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>/</span><span> </span></span><span>2</span><span><span> </span><span>&lt;</span><span> desiredTotal) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>// desiredTotal is too large to reach</span></div></div><div><div><div>11</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> </span><span>dfs</span><span>(maxChoosableInteger, </span><span>0</span><span>, desiredTotal, </span><span>new</span><span> </span><span>int</span><span>[(</span><span>1</span><span><span> </span><span>&lt;&lt;</span><span> (maxChoosableInteger))]);</span></span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span> </span><span>maxChoosableInteger</span><span>, </span></span><span>int</span><span><span> </span><span>chosen</span><span>, </span></span><span>int</span><span><span> </span><span>remaining</span><span>, </span></span><span>int</span><span><span>[] </span><span>memo</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (memo[chosen] </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>// win case</span></div></div><div><div><div>20</div></div><div><span>            </span><span>return</span><span><span> memo[chosen] </span><span>==</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> maxChoosableInteger; i </span><span>&gt;=</span><span> </span></span><span>1</span><span>; i--) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>// current state is chosen and we want to try number i, next state is chosen ^ (1 &lt;&lt; i - 1).</span></div></div><div><div><div>25</div></div><div><span>            </span><span>int</span><span><span> </span><span>mask</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span> </span><span>&lt;&lt;</span><span> (i</span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>26</div></div><div><span>            </span><span>if</span><span><span> ((chosen </span><span>&amp;</span><span> mask) </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>&gt;=</span><span> remaining) {</span></span></div></div><div><div><div>30</div></div><div><span>                </span><span>// reach or exceed desired total</span></div></div><div><div><div>31</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>            </span><span>// first player win</span></div></div><div><div><div>35</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>dfs</span><span><span>(maxChoosableInteger, chosen </span><span>|</span><span> mask, remaining </span><span>-</span><span> i, memo)) {</span></span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>memo[chosen] </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>37</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>        </span><span>// second player win</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>memo[chosen] </span><span>=</span><span> </span><span>-</span><span>1</span><span>;</span></div></div><div><div><div>43</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>465. Optimal Account Balancing<a href="#465-optimal-account-balancing"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/optimal-account-balancing/" target="_blank">https://leetcode.com/problems/optimal-account-balancing/</a></p><hr /><p>首先使用两个HashMap统计出每个人的净收入/支出情况。之后使用DFS进行回溯，找到第一个债务不是0的人固定为<code>start</code>，然后在此人后面找到另一个债务也不是0，并且极性与之相反的人，试图让这两个人完成交易互相清算一次债务。以此类推，之后的人按照这个流程，然后根据回溯判断出哪一种方案需要的交易次数最少。</p><p>如果要进一步加快运行速度，可以对一些特殊情况进行优化，在开始DFS之前先检查一遍，找出所有双人组，每个双人组中的一个人恰好需要偿还给另一个人所应得的债务。这种交易方式一定是最优的，因为它只需要最少的交易次数，就能让两个人的最终债务情况都变成0。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minTransfers</span><span>(</span><span>int</span><span><span>[][] </span><span>transactions</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// track each person's net balance</span></div></div><div><div><div>4</div></div><div><span>        </span><span>HashMap</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>();</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>transaction</span><span> </span></span><span>:</span><span> transactions) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>// Subtract from source</span></div></div><div><div><div>8</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(transaction[</span><span>0</span><span>], </span><span>map</span><span>.</span><span>getOrDefault</span><span>(transaction[</span><span>0</span><span>], </span><span>0</span><span><span>) </span><span>-</span><span> transaction[</span></span><span>2</span><span>]);</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>            </span><span>// Add to target</span></div></div><div><div><div>11</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(transaction[</span><span>1</span><span>], </span><span>map</span><span>.</span><span>getOrDefault</span><span>(transaction[</span><span>1</span><span>], </span><span>0</span><span><span>) </span><span>+</span><span> transaction[</span></span><span>2</span><span>]);</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>balances</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>map</span><span>.</span><span>size</span><span>()];</span></div></div><div><div><div>15</div></div><div><span>        </span><span>int</span><span><span> </span><span>idx</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>key</span><span> </span></span><span>:</span><span> </span><span>map</span><span>.</span><span>keySet</span><span>()) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span> (</span><span>map</span><span>.</span><span>get</span><span><span>(key) </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>balances[idx] </span><span>=</span><span> </span><span>map</span><span>.</span><span>get</span><span>(key);</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>idx++;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> </span><span>dfs</span><span>(</span><span>0</span><span>, balances);</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span> </span><span>start</span><span>, </span></span><span>int</span><span><span>[] </span><span>balances</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>// find first non-zero.</span></div></div><div><div><div>28</div></div><div><span>        </span><span>while</span><span><span> (start </span><span>&lt;</span><span> </span></span><span>balances</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> balances[start] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>start++;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>// all debts are cleared</span></div></div><div><div><div>33</div></div><div><span>        </span><span>if</span><span><span> (start </span><span>==</span><span> </span></span><span>balances</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>34</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>int</span><span><span> </span><span>min</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>// Avoid previous duplicate back-to-back balances. Default is 0, since we check non-zero balances anyway</span></div></div><div><div><div>40</div></div><div><span>        </span><span>int</span><span><span> </span><span>prev</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>// FIRST check all pairs of opposite balances that cancel each other out, before diving deep into DFS.</span></div></div><div><div><div>43</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> start </span><span>+</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>balances</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>44</div></div><div><span>            </span><span>if</span><span><span> (balances[start] </span><span>+</span><span> balances[i] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>45</div></div><div><span><span>                </span></span><span>balances[i] </span><span>+=</span><span> balances[start];</span></div></div><div><div><div>46</div></div><div><span><span>                </span></span><span>min </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(min, </span><span>1</span><span><span> </span><span>+</span><span> </span></span><span>dfs</span><span><span>(start </span><span>+</span><span> </span></span><span>1</span><span>, balances));</span></div></div><div><div><div>47</div></div><div><span><span>                </span></span><span>balances[i] </span><span>-=</span><span> balances[start];</span></div></div><div><div><div>48</div></div><div><span><span>                </span></span><span>prev </span><span>=</span><span> balances[i];</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>                </span><span>// early termination, since this will be the best settling of debts</span></div></div><div><div><div>51</div></div><div><span>                </span><span>return</span><span> min;</span></div></div><div><div><div>52</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>54</div></div><div>
</div></div><div><div><div>55</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> start </span><span>+</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>balances</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>56</div></div><div><span>            </span><span>if</span><span><span> (balances[i] </span><span>!=</span><span> prev </span><span>&amp;&amp;</span><span> balances[start] </span><span>*</span><span> balances[i] </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>57</div></div><div><span><span>                </span></span><span>balances[i] </span><span>+=</span><span> balances[start];</span></div></div><div><div><div>58</div></div><div><span><span>                </span></span><span>min </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(min, </span><span>1</span><span><span> </span><span>+</span><span> </span></span><span>dfs</span><span><span>(start </span><span>+</span><span> </span></span><span>1</span><span>, balances));</span></div></div><div><div><div>59</div></div><div><span><span>                </span></span><span>balances[i] </span><span>-=</span><span> balances[start];</span></div></div><div><div><div>60</div></div><div><span><span>                </span></span><span>prev </span><span>=</span><span> balances[i];</span></div></div><div><div><div>61</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>62</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>63</div></div><div>
</div></div><div><div><div>64</div></div><div><span>        </span><span>// If the min is still Integer.MAX_VALUE, we've settled all balances to 0, so the fewest transactions is now 0.</span></div></div><div><div><div>65</div></div><div><span>        </span><span>return</span><span><span> min </span><span>==</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span> </span><span>?</span><span> </span><span>0</span><span> </span><span>:</span><span> min;</span></div></div><div><div><div>66</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>67</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>466. Count The Repetitions<a href="#466-count-the-repetitions"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/count-the-repetitions/" target="_blank">https://leetcode.com/problems/count-the-repetitions/</a></p><hr /><p>双指针法，移动<code>idx1</code>使得<code>idx1</code>与<code>idx2</code>指向相同字符，分类讨论两种情况，要么是<code>idx2</code>走完了一个<code>s2</code>长度；要么是发现<code>idx1</code>走了一个完整的循环，并用这个<code>idx2</code>长度除以<code>s2</code>长度除以<code>s2</code>重复次数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>class</span><span><span> </span><span>Index</span><span> </span></span><span>{</span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span> idx1</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span> idx2</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>public</span><span> </span><span>Index</span><span>(</span><span>int</span><span><span> </span><span>i1</span><span>, </span></span><span>int</span><span><span> </span><span>i2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>idx1 </span><span>=</span><span> i1;</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>idx2 </span><span>=</span><span> i2;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>getMaxRepetitions</span><span>(</span><span>String</span><span><span> </span><span>s1</span><span>, </span></span><span>int</span><span><span> </span><span>n1</span><span>, </span></span><span>String</span><span><span> </span><span>s2</span><span>, </span></span><span>int</span><span><span> </span><span>n2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>HashMap</span><span>&lt;</span><span>Integer</span><span>, </span><span>Index</span><span><span>&gt; </span><span>idxMap</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>();</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span> </span><span>len1</span><span> </span></span><span><span>=</span><span> </span></span><span>s1</span><span>.</span><span>length</span><span><span>(), len2 </span><span>=</span><span> </span></span><span>s2</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>15</div></div><div><span>        </span><span>int</span><span><span> </span><span>idx1</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, idx2 </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span> </span><span>totalCharsOf1</span><span> </span></span><span><span>=</span><span> len1 </span><span>*</span><span> n1;</span></span></div></div><div><div><div>17</div></div><div><span>        </span><span>while</span><span><span> (idx1 </span><span>&lt;</span><span> totalCharsOf1) {</span></span></div></div><div><div><div>18</div></div><div><span>            </span><span>int</span><span><span> </span><span>modIdx1</span><span> </span></span><span><span>=</span><span> idx1 </span><span>%</span><span> len1;</span></span></div></div><div><div><div>19</div></div><div><span>            </span><span>int</span><span><span> </span><span>modIdx2</span><span> </span></span><span><span>=</span><span> idx2 </span><span>%</span><span> len2;</span></span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>if</span><span> (</span><span>s1</span><span>.</span><span>charAt</span><span><span>(modIdx1) </span><span>==</span><span> </span></span><span>s2</span><span>.</span><span>charAt</span><span>(modIdx2)) {</span></div></div><div><div><div>22</div></div><div><span>                </span><span>int</span><span><span> </span><span>key</span><span> </span></span><span><span>=</span><span> modIdx1 </span><span>*</span><span> </span></span><span>1000</span><span><span> </span><span>+</span><span> modIdx2;</span></span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>                </span><span>if</span><span> (</span><span>idxMap</span><span>.</span><span>containsKey</span><span>(key)) {</span></div></div><div><div><div>25</div></div><div><span>                    </span><span>Index</span><span><span> </span><span>prev</span><span> </span></span><span><span>=</span><span> </span></span><span>idxMap</span><span>.</span><span>get</span><span>(key);</span></div></div><div><div><div>26</div></div><div><span>                    </span><span>int</span><span><span> </span><span>d1</span><span> </span></span><span><span>=</span><span> idx1 </span><span>-</span><span> </span></span><span>prev</span><span>.</span><span>idx1</span><span>;</span></div></div><div><div><div>27</div></div><div><span>                    </span><span>int</span><span><span> </span><span>d2</span><span> </span></span><span><span>=</span><span> idx2 </span><span>-</span><span> </span></span><span>prev</span><span>.</span><span>idx2</span><span>;</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>                    </span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> (totalCharsOf1 </span><span>-</span><span> idx1) </span><span>/</span><span> d1;</span></span></div></div><div><div><div>30</div></div><div><span><span>                    </span></span><span>idx1 </span><span>+=</span><span> k </span><span>*</span><span> d1;</span></div></div><div><div><div>31</div></div><div><span><span>                    </span></span><span>idx2 </span><span>+=</span><span> k </span><span>*</span><span> d2;</span></div></div><div><div><div>32</div></div><div><span>                    </span><span>if</span><span><span> (idx1 </span><span>&gt;=</span><span> totalCharsOf1) {</span></span></div></div><div><div><div>33</div></div><div><span>                        </span><span>break</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>36</div></div><div><span>                    </span><span>idxMap</span><span>.</span><span>put</span><span>(key, </span><span>new</span><span> </span><span>Index</span><span>(idx1, idx2));</span></div></div><div><div><div>37</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span><span>                </span></span><span>idx2++;</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>idx1++;</span></div></div><div><div><div>43</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span>        </span><span>return</span><span><span> idx2 </span><span>/</span><span> len2 </span><span>/</span><span> n2;</span></span></div></div><div><div><div>46</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>467. Unique Substrings in Wraparound String<a href="#467-unique-substrings-in-wraparound-string"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/unique-substrings-in-wraparound-string/" target="_blank">https://leetcode.com/problems/unique-substrings-in-wraparound-string/</a></p><hr /><p>使用一个map，用于统计以每个字母为开头的子字符串的个数。如果给定的原字符串是连续的，那么很显然每遍历一个字符，连续字符串的<code>size</code>就增加1，遍历<code>n</code>个字符之后以起始字符开头的子字符串就是<code>n</code>个，第二个字符开头的子字符串就是<code>n-1</code>个，以此类推。</p><p>完成遍历后，对于每个字母做一下比较，比较这个字母是作为一个子字符串头，能生成的数量多，还是作为一个已有连续子字符串的中间元素，能生成的数量多。注意因为是循环数组，需要循环两次，保证map中的每个元素都能被更新。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findSubstringInWraproundString</span><span>(</span><span>String</span><span><span> </span><span>p</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>p</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>chs</span><span> </span></span><span><span>=</span><span> </span></span><span>p</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>9</div></div><div><span>        </span><span>char</span><span><span> </span><span>head</span><span> </span></span><span><span>=</span><span> chs[</span></span><span>0</span><span>];</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>size</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// current consecutive substring length</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>chs</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>isAdjacent</span><span><span>(chs[i </span><span>-</span><span> </span></span><span>1</span><span>], chs[i])) {</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>size++;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>map[head </span><span>-</span><span> </span><span>'a'</span><span><span>] </span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span><span>(map[head </span><span>-</span><span> </span></span><span>'a'</span><span>], size);</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>size </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>head </span><span>=</span><span> chs[i];</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>// last consecutive substring</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>map[head </span><span>-</span><span> </span><span>'a'</span><span><span>] </span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span><span>(map[head </span><span>-</span><span> </span></span><span>'a'</span><span>], size);</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// repeat loop to ensure to update all elements</span></div></div><div><div><div>25</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>26</span><span>; i++) {</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>map[i </span><span>%</span><span> </span><span>26</span><span><span>] </span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span><span>(map[i </span><span>%</span><span> </span></span><span>26</span><span><span>], map[(i </span><span>+</span><span> </span></span><span>25</span><span><span>) </span><span>%</span><span> </span></span><span>26</span><span><span>] </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>26</span><span>; i++) {</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>map[i </span><span>%</span><span> </span><span>26</span><span><span>] </span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span><span>(map[i </span><span>%</span><span> </span></span><span>26</span><span><span>], map[(i </span><span>+</span><span> </span></span><span>25</span><span><span>) </span><span>%</span><span> </span></span><span>26</span><span><span>] </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>34</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span></span><span>:</span><span> map) {</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> num;</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isAdjacent</span><span>(</span><span>char</span><span><span> </span><span>a</span><span>, </span></span><span>char</span><span><span> </span><span>b</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>41</div></div><div><span>        </span><span>return</span><span><span> a </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>==</span><span> b </span><span>||</span><span> a </span><span>==</span><span> </span></span><span>'z'</span><span><span> </span><span>&amp;&amp;</span><span> b </span><span>==</span><span> </span></span><span>'a'</span><span>;</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>468. Validate IP Address<a href="#468-validate-ip-address"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/validate-ip-address/" target="_blank">https://leetcode.com/problems/validate-ip-address/</a></p><hr /><p>使用<code>split()</code>函数分割输入IP，之后进行检查：</p><ul>
<li>对于IPv4而言，每个部分需要是整数，不能大于255，如果是0长度必须为1；总共只能有4个整数</li>
<li>对于IPv6而言，每个部分需要是整数，不能超过65535，长度不能超过4；总共只能有8个整数</li>
</ul><p>注意输入的<code>queryIP</code>可能在结尾包含空字符串，需要在<code>split()</code>中把<code>limit</code>参数设为-1，这样不会忽略空字符串。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>validIPAddress</span><span>(</span><span>String</span><span><span> </span><span>queryIP</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>isIPv4</span><span>(queryIP)) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>"IPv4"</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>isIPv6</span><span>(queryIP)) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>return</span><span> </span><span>"IPv6"</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>return</span><span> </span><span>"Neither"</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isIPv4</span><span>(</span><span>String</span><span><span> </span><span>ip</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>// trailing empty strings will not be trimmed</span></div></div><div><div><div>14</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>arr</span><span> </span></span><span><span>=</span><span> </span></span><span>ip</span><span>.</span><span>split</span><span>(</span><span>"</span><span>\\</span><span>."</span><span><span>, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>a</span></span><span>:</span><span> arr) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>try</span><span> {</span></div></div><div><div><div>18</div></div><div><span>                </span><span>if</span><span> (</span><span>Integer</span><span>.</span><span>parseInt</span><span><span>(a) </span><span>&gt;</span><span> </span></span><span>255</span><span><span> </span><span>||</span><span> (</span></span><span>a</span><span>.</span><span>charAt</span><span>(</span><span>0</span><span><span>) </span><span>==</span><span> </span></span><span>'0'</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>a</span><span>.</span><span>length</span><span><span>() </span><span>!=</span><span> </span></span><span>1</span><span>)) {</span></div></div><div><div><div>19</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>} </span><span>catch</span><span> (</span><span>NumberFormatException</span><span><span> </span><span>e</span><span>) {</span></span></div></div><div><div><div>22</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> </span><span>arr</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>4</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isIPv6</span><span>(</span><span>String</span><span><span> </span><span>ip</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>30</div></div><div><span>        </span><span>// trailing empty strings will not be trimmed</span></div></div><div><div><div>31</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>arr</span><span> </span></span><span><span>=</span><span> </span></span><span>ip</span><span>.</span><span>split</span><span>(</span><span>":"</span><span><span>, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>a</span></span><span>:</span><span> arr) {</span></div></div><div><div><div>34</div></div><div><span>            </span><span>try</span><span> {</span></div></div><div><div><div>35</div></div><div><span>                </span><span>if</span><span> (</span><span>Integer</span><span>.</span><span>parseInt</span><span>(a, </span><span>16</span><span><span>) </span><span>&gt;</span><span> </span></span><span>65535</span><span><span> </span><span>||</span><span> </span></span><span>a</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>4</span><span>) {</span></div></div><div><div><div>36</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>} </span><span>catch</span><span> (</span><span>NumberFormatException</span><span><span> </span><span>e</span><span>) {</span></span></div></div><div><div><div>39</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>        </span><span>return</span><span> </span><span>arr</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>8</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>45</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>469. Convex Polygon<a href="#469-convex-polygon"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/convex-polygon/" target="_blank">https://leetcode.com/problems/convex-polygon/</a></p><hr /><p>凸多边形任何一个内角不能超过180度，所以相邻三个点组成的两条相邻边，交点不能在多边形内部。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isConvex</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>points</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>flag</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>points</span><span>.</span><span>size</span><span>(); i++) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>int</span><span><span> </span><span>angle</span><span> </span></span><span><span>=</span><span> </span></span><span>getAngle</span><span>(points, i);</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>            </span><span>// collinear</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (angle </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>if</span><span><span> (flag </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>flag </span><span>=</span><span> angle </span><span>&gt;</span><span> </span><span>0</span><span> </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (flag </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>!=</span><span> angle </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>                </span><span>// angles cannot exceed 180 degree</span></div></div><div><div><div>17</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>getAngle</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>points</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>// add modular to inspect last two elements</span></div></div><div><div><div>26</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>points</span><span>.</span><span>get</span><span><span>(i </span><span>%</span><span> </span></span><span>points</span><span>.</span><span>size</span><span>());</span></div></div><div><div><div>27</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>b</span><span> </span></span><span><span>=</span><span> </span></span><span>points</span><span>.</span><span>get</span><span><span>((i </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>%</span><span> </span></span><span>points</span><span>.</span><span>size</span><span>());</span></div></div><div><div><div>28</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>a</span><span> </span></span><span><span>=</span><span> </span></span><span>points</span><span>.</span><span>get</span><span><span>((i </span><span>+</span><span> </span></span><span>2</span><span><span>) </span><span>%</span><span> </span></span><span>points</span><span>.</span><span>size</span><span>());</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span> (</span><span>a</span><span>.</span><span>get</span><span>(</span><span>1</span><span><span>) </span><span>-</span><span> </span></span><span>b</span><span>.</span><span>get</span><span>(</span><span>1</span><span><span>)) </span><span>*</span><span> (</span></span><span>b</span><span>.</span><span>get</span><span>(</span><span>0</span><span><span>) </span><span>-</span><span> </span></span><span>c</span><span>.</span><span>get</span><span>(</span><span>0</span><span><span>)) </span><span>-</span><span> (</span></span><span>b</span><span>.</span><span>get</span><span>(</span><span>1</span><span><span>) </span><span>-</span><span> </span></span><span>c</span><span>.</span><span>get</span><span>(</span><span>1</span><span><span>)) </span><span>*</span><span> (</span></span><span>a</span><span>.</span><span>get</span><span>(</span><span>0</span><span><span>) </span><span>-</span><span> </span></span><span>b</span><span>.</span><span>get</span><span>(</span><span>0</span><span>));</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>470. Implement Rand10() Using Rand7()<a href="#470-implement-rand10-using-rand7"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/implement-rand10-using-rand7/" target="_blank">https://leetcode.com/problems/implement-rand10-using-rand7/</a></p><hr /><p><code>rand7()</code>是1～7，所以<code>rand7() - 1</code>是0～6，用<code>(rand7() - 1) * 7 + rand7() - 1</code>凑出0～48，丢弃40～48便能得到0～39，对这个结果%10 + 1就是0～10。</p><p>一般情况下，如果要用<code>randN()</code>实现<code>randM()</code>，<code>M &gt; N</code>，则应该先生成一个中间的<code>X = N^(b + 1)</code>，且<code>randX() = N^b * (randN() - 1) + N^(b - 1) * (randN() - 1) + N^(b - 2) * (randN() - 1) + ... + N^0 * (randN() - 1)</code>。有了<code>randX()</code>之后再舍弃一部分值使得<code>randX()</code>的范围是<code>randM()</code>的倍数，这样就能按比例缩小范围生成<code>randM()</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* The rand7() API is already defined in the parent class SolBase.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public int rand7();</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>* </span><span>@return</span><span> a random integer in the range 1 to 7</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>6</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>extends</span><span><span> </span><span>SolBase</span><span> </span></span><span>{</span></div></div><div><div><div>7</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>rand10</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>rand40</span><span> </span></span><span><span>=</span><span> </span></span><span>40</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>while</span><span><span> (rand40 </span><span>&gt;=</span><span> </span></span><span>40</span><span>) {</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>rand40 </span><span>=</span><span> (</span><span>rand7</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span><span>) </span><span>*</span><span> </span></span><span>7</span><span><span> </span><span>+</span><span> </span></span><span>rand7</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span><span> rand40 </span><span>%</span><span> </span></span><span>10</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>471. Encode String with Shortest Length<a href="#471-encode-string-with-shortest-length"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/encode-string-with-shortest-length/" target="_blank">https://leetcode.com/problems/encode-string-with-shortest-length/</a></p><hr /><p>使用HashMap存储每个子字符串的encode结果，加快中间过程推导。循环遍历每个可能子字符串长度，并尝试对于每个子字符串，是子字符串本身更长，还是压缩编码后更长，不断累加起来。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>String</span><span><span>,</span><span> </span></span><span>String</span><span><span>&gt;</span><span> map </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>encode</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span>(s)) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>return</span><span> </span><span>map</span><span>.</span><span>get</span><span>(s);</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>        </span><span>String</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> s;</span></span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>l</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; l </span><span>&lt;=</span><span> </span></span><span>result</span><span>.</span><span>length</span><span>(); l++) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>countRepeat</span><span>(s, l);</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>// minimize temp string's length</span></div></div><div><div><div>14</div></div><div><span>            </span><span>String</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>substring</span><span>(</span><span>0</span><span>, l);</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span><span> (count </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>temp </span><span>=</span><span> </span><span>encode</span><span>(temp);</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>            </span><span>int</span><span><span> </span><span>tempLength</span><span> </span></span><span><span>=</span><span> </span></span><span>temp</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>            </span><span>// determine whether encoding process does not make the string shorter</span></div></div><div><div><div>21</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>r</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; r </span><span>&lt;=</span><span> count; r++) {</span></span></div></div><div><div><div>22</div></div><div><span>                </span><span>StringBuilder</span><span><span> </span><span>builder</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>                </span><span>// digit + [ + ], or raw temp string</span></div></div><div><div><div>25</div></div><div><span>                </span><span>if</span><span><span> (tempLength </span><span>+</span><span> </span></span><span>3</span><span><span> </span><span>&lt;</span><span> tempLength </span><span>*</span><span> r) {</span></span></div></div><div><div><div>26</div></div><div><span>                    </span><span>builder</span><span>.</span><span>append</span><span>(r).</span><span>append</span><span>(</span><span>"["</span><span>).</span><span>append</span><span>(temp).</span><span>append</span><span>(</span><span>"]"</span><span>);</span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>28</div></div><div><span>                    </span><span>builder</span><span>.</span><span>append</span><span>(s, </span><span>0</span><span><span>, r </span><span>*</span><span> l);</span></span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>                </span><span>builder</span><span>.</span><span>append</span><span>(</span><span>encode</span><span>(</span><span>s</span><span>.</span><span>substring</span><span><span>(r </span><span>*</span><span> l)));</span></span></div></div><div><div><div>32</div></div><div><span>                </span><span>if</span><span> (</span><span>builder</span><span>.</span><span>length</span><span><span>() </span><span>&lt;</span><span> </span></span><span>result</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>33</div></div><div><span><span>                    </span></span><span>result </span><span>=</span><span> </span><span>builder</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(s, result);</span></div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>countRepeat</span><span>(</span><span>String</span><span><span> </span><span>input</span><span>, </span></span><span>int</span><span><span> </span><span>max</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>43</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>44</div></div><div><span>        </span><span>while</span><span><span> ((i </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>*</span><span> max </span><span>&lt;=</span><span> </span></span><span>input</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>45</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> max; j++) {</span></span></div></div><div><div><div>46</div></div><div><span>                </span><span>if</span><span> (</span><span>input</span><span>.</span><span>charAt</span><span><span>(j) </span><span>!=</span><span> </span></span><span>input</span><span>.</span><span>charAt</span><span><span>(max </span><span>*</span><span> i </span><span>+</span><span> j)) {</span></span></div></div><div><div><div>47</div></div><div><span>                    </span><span>return</span><span> i;</span></div></div><div><div><div>48</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span><span>            </span></span><span>i++;</span></div></div><div><div><div>51</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>52</div></div><div>
</div></div><div><div><div>53</div></div><div><span>        </span><span>return</span><span> i;</span></div></div><div><div><div>54</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>472. Concatenated Words<a href="#472-concatenated-words"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/concatenated-words/" target="_blank">https://leetcode.com/problems/concatenated-words/</a></p><hr /><p>使用<code>Trie</code>，先把所有<code>words按</code>长短排序，把短词优先插入<code>Trie</code>中。之后的长词进来可以尝试进行匹配，长词匹配完到一个短词之后，检查是否之后的部分还能匹配上其他短词，直到整个词都匹配完毕。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>findAllConcatenatedWordsInADict</span><span>(</span><span>String</span><span><span>[] </span><span>words</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(words, </span><span>Comparator</span><span>.</span><span>comparingInt</span><span>(String</span><span>::</span><span>length));</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>Trie</span><span><span> </span><span>trie</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Trie</span><span>();</span></div></div><div><div><div>6</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>String</span><span>&gt;();</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>word</span><span> </span></span><span>:</span><span> words) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span> (</span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span> (</span><span>trie</span><span>.</span><span>search</span><span>(word)) {</span></div></div><div><div><div>12</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(word);</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>14</div></div><div><span>                </span><span>trie</span><span>.</span><span>insert</span><span>(word);</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>class</span><span><span> </span><span>Trie</span><span> </span></span><span>{</span></div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>static</span><span> </span><span>class</span><span><span> </span><span>Node</span><span> </span></span><span>{</span></div></div><div><div><div>24</div></div><div><span>        </span><span>Node</span><span>[] children</span><span>;</span></div></div><div><div><div>25</div></div><div><span>        </span><span>boolean</span><span> isEnd</span><span>;</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>Node</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>children </span><span>=</span><span> </span><span>new</span><span> </span><span>Node</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>isEnd </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>    </span><span>private</span><span> </span><span>Node</span><span> root </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span><span>()</span><span>;</span></span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>insert</span><span>(</span><span>String</span><span><span> </span><span>key</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>36</div></div><div><span>        </span><span>Node</span><span><span> </span><span>curr</span><span> </span></span><span><span>=</span><span> root;</span></span></div></div><div><div><div>37</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>key</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>38</div></div><div><span>            </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>key</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span>;</span></div></div><div><div><div>39</div></div><div><span>            </span><span>if</span><span> (</span><span>curr</span><span>.</span><span>children</span><span><span>[index] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>40</div></div><div><span>                </span><span>curr</span><span>.</span><span>children</span><span><span>[index] </span><span>=</span><span> </span></span><span>new</span><span> </span><span>Node</span><span>();</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>curr </span><span>=</span><span> </span><span>curr</span><span>.</span><span>children</span><span>[index];</span></div></div><div><div><div>43</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>        </span><span>curr</span><span>.</span><span>isEnd</span><span><span> </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>search</span><span>(</span><span>String</span><span><span> </span><span>key</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>48</div></div><div><span>        </span><span>return</span><span> </span><span>search</span><span>(key, </span><span>0</span><span>);</span></div></div><div><div><div>49</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>search</span><span>(</span><span>String</span><span><span> </span><span>key</span><span>, </span></span><span>int</span><span><span> </span><span>pos</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>52</div></div><div><span>        </span><span>if</span><span><span> (pos </span><span>==</span><span> </span></span><span>key</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>53</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>54</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>        </span><span>Node</span><span><span> </span><span>curr</span><span> </span></span><span><span>=</span><span> root;</span></span></div></div><div><div><div>57</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> pos; i </span><span>&lt;</span><span> </span></span><span>key</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>58</div></div><div><span>            </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>key</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'a'</span><span>;</span></div></div><div><div><div>59</div></div><div><span>            </span><span>if</span><span> (</span><span>curr</span><span>.</span><span>children</span><span><span>[index] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>60</div></div><div><span>                </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>61</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>62</div></div><div><span><span>            </span></span><span>curr </span><span>=</span><span> </span><span>curr</span><span>.</span><span>children</span><span>[index];</span></div></div><div><div><div>63</div></div><div><span>            </span><span>if</span><span> (</span><span>curr</span><span>.</span><span>isEnd</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>search</span><span><span>(key, i </span><span>+</span><span> </span></span><span>1</span><span>)) {</span></div></div><div><div><div>64</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>65</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>66</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>67</div></div><div>
</div></div><div><div><div>68</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>69</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>70</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>473. Matchsticks to Square<a href="#473-matchsticks-to-square"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/matchsticks-to-square/" target="_blank">https://leetcode.com/problems/matchsticks-to-square/</a></p><hr /><p>使用回溯算法，首先可以把所有火柴的长度加起来，只有总长是4的倍数才能组成正方形，并且如果能组成正方形其边长一定是总和的1/4。有了这个目标就能回溯进行尝试，把所有火柴按长度排序之后，从最长边开始尝试把四边都填满，如果已经当前边已有长度 + 当前火柴太长，或者是发现已有的两条边一样长，就跳过尝试填下一条边。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>makesquare</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>sum </span><span>+=</span><span> num;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// must be 4's multiples to form a square</span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (sum </span><span>%</span><span> </span></span><span>4</span><span><span> </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(nums);</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>// start from the longest matchstick</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> </span><span>backtrack</span><span>(nums, </span><span>new</span><span> </span><span>int</span><span>[</span><span>4</span><span>], </span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span>, sum </span><span>/</span><span> </span></span><span>4</span><span>);</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>boolean</span><span> </span><span>backtrack</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span>[] </span><span>sums</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (index </span><span>==</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>4</span><span>; i++) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>// current sum + edge is too big, or there are already two same edges</span></div></div><div><div><div>30</div></div><div><span>            </span><span>if</span><span><span> ((sums[i] </span><span>+</span><span> nums[index] </span><span>&gt;</span><span> target) </span><span>||</span><span> (i </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> sums[i] </span><span>==</span><span> sums[i</span><span>-</span></span><span>1</span><span>])) {</span></div></div><div><div><div>31</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>            </span><span>// try to fill current sums[i]</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>sums[i] </span><span>+=</span><span> nums[index];</span></div></div><div><div><div>36</div></div><div><span>            </span><span>if</span><span> (</span><span>backtrack</span><span><span>(nums, sums, index </span><span>-</span><span> </span></span><span>1</span><span>, target)) {</span></div></div><div><div><div>37</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>sums[i] </span><span>-=</span><span> nums[index];</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>474. Ones and Zeroes<a href="#474-ones-and-zeroes"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/ones-and-zeroes/" target="_blank">https://leetcode.com/problems/ones-and-zeroes/</a></p><hr /><p>动态规划，<code>dp[i][j]</code>表示能用<code>i</code>个0，<code>j</code>个1构成的最大子集大小。遍历每个字符串，每个字符串必然有<code>zero</code>个0和<code>one</code>个1。如果用了当前这个字符串，那么就剩下<code>i - zero</code>个0，<code>j - one</code>个字符串，最大子集就变成了<code>dp[i - zero][j - one] + 1</code>，此处的1指的是当前这个字符串本身也在最大子集内；而如果不用当前这个字符串，最大子集仍然是由<code>dp[i][j]</code>推出。二者的最大值就是目标解。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findMaxForm</span><span>(</span><span>String</span><span><span>[] </span><span>strs</span><span>, </span></span><span>int</span><span><span> </span><span>m</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[m </span><span>+</span><span> </span></span><span>1</span><span><span>][n </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>str</span><span> </span></span><span>:</span><span> strs) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>int</span><span><span> </span><span>one</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div><span>            </span><span>int</span><span><span> </span><span>zero</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>            </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>str</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>10</div></div><div><span>                </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'1'</span><span>) {</span></div></div><div><div><div>11</div></div><div><span><span>                    </span></span><span>one++;</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>zero++;</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> m; i </span><span>&gt;=</span><span> zero; i--) {</span></span></div></div><div><div><div>18</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> n; j </span><span>&gt;=</span><span> one; j--) {</span></span></div></div><div><div><div>19</div></div><div><span>                    </span><span>if</span><span><span> (zero </span><span>&lt;=</span><span> i </span><span>&amp;&amp;</span><span> one </span><span>&lt;=</span><span> j) {</span></span></div></div><div><div><div>20</div></div><div><span>                        </span><span>// dp[i][j] is the max number of str we can pick with i "0"s and j "1"s</span></div></div><div><div><div>21</div></div><div><span><span>                        </span></span><span>dp[i][j] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(dp[i][j], dp[i </span><span>-</span><span> zero][j </span><span>-</span><span> one] </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>22</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> dp[m][n];</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>475. Heaters<a href="#475-heaters"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/heaters/" target="_blank">https://leetcode.com/problems/heaters/</a></p><hr /><p>先把<code>house</code>和<code>heater</code>排序，之后双指针法，对于每个<code>house</code>找到第一个比它大的<code>heater</code>，有三种情况：</p><ul>
<li><code>heater</code>是全部<code>heaters</code>里最小的，那么这台<code>heater</code>必须要覆盖到当前<code>house</code>，这段距离要被更新到<code>result</code>里</li>
<li><code>heater</code>是全部<code>heaters</code>里最大的，那么这台<code>heater</code>也必须要覆盖到当前<code>house</code>，这段距离要被更新到<code>result</code>里</li>
<li><code>heater</code>位于<code>house[i-1]</code>和<code>house[i]</code>之间，那么比较<code>heater</code>和这两个房子之间的距离，短的那段就是最小需覆盖距离</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findRadius</span><span>(</span><span>int</span><span><span>[] </span><span>houses</span><span>, </span></span><span>int</span><span><span>[] </span><span>heaters</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(houses);</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(heaters);</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, j </span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>houses</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>while</span><span><span> (j </span><span>&lt;</span><span> </span></span><span>heaters</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> heaters[j] </span><span>&lt;=</span><span> houses[i]) {</span></span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>j++;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (j </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>// the leftmost house must be covered by the first heaters</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, heaters[</span><span>0</span><span><span>] </span><span>-</span><span> houses[i]);</span></span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (j </span><span>==</span><span> </span></span><span>heaters</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>                </span><span>// the rightmost house must be covered by the last heaters</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, houses[i] </span><span>-</span><span> heaters[j</span><span>-</span></span><span>1</span><span>]);</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>19</div></div><div><span>                </span><span>// heaters[j-1] &lt; houses[i] &lt; heaters[j], choose the min distance between them</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, </span><span>Math</span><span>.</span><span>min</span><span><span>(houses[i] </span><span>-</span><span> heaters[j</span><span>-</span></span><span>1</span><span><span>], heaters[j] </span><span>-</span><span> houses[i]));</span></span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>476. Number Complement<a href="#476-number-complement"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/number-complement/" target="_blank">https://leetcode.com/problems/number-complement/</a></p><hr /><p>按照补码公式推导。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findComplement</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>while</span><span><span> (n </span><span>&lt;</span><span> num) {</span></span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>n </span><span>=</span><span> </span><span>2</span><span><span>*</span><span>n </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>        </span><span>return</span><span><span> n </span><span>-</span><span> num;</span></span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>477. Total Hamming Distance<a href="#477-total-hamming-distance"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/total-hamming-distance/" target="_blank">https://leetcode.com/problems/total-hamming-distance/</a></p><hr /><p>对于<code>n</code>个数，因为每个数都是32位，遍历每一位，如果<code>n</code>个数中有<code>k</code>个数这一位是1，<code>n-k</code>个数这一位是0，那么这一位就会让总的hamming distance增加<code>k * (n - k)</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>totalHammingDistance</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, n </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>32</span><span>; j++) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>int</span><span><span> </span><span>bitCount</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>            </span><span>// if there are n integers, k of them have a particular bit set and (n-k) do not,</span></div></div><div><div><div>9</div></div><div><span>            </span><span>// then that bit contributes k*(n-k) hamming distance to the total</span></div></div><div><div><div>10</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>bitCount </span><span>+=</span><span> (nums[i] </span><span>&gt;&gt;</span><span> j) </span><span>&amp;</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> bitCount</span><span>*</span><span>(n </span><span>-</span><span> bitCount);</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>478. Generate Random Point in a Circle<a href="#478-generate-random-point-in-a-circle"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/generate-random-point-in-a-circle/" target="_blank">https://leetcode.com/problems/generate-random-point-in-a-circle/</a></p><hr /><p>用极坐标形式去理解，因为圆的半径是<code>radius</code>，与<code>x</code>轴形成夹角最大是<code>2 * pi</code>，所以这二者分别乘以一个<code>[0, 1]</code>之间的随机数，就能得到一个圆内的点。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>double</span><span><span> radius</span><span>,</span><span> x_center</span><span>,</span><span> y_center</span></span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>Solution</span><span>(</span><span>double</span><span><span> </span><span>radius</span><span>, </span></span><span>double</span><span><span> </span><span>x_center</span><span>, </span></span><span>double</span><span><span> </span><span>y_center</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>this</span><span>.</span><span>radius</span><span><span> </span><span>=</span><span> radius;</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>this</span><span>.</span><span>x_center</span><span><span> </span><span>=</span><span> x_center;</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>this</span><span>.</span><span>y_center</span><span><span> </span><span>=</span><span> y_center;</span></span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>    </span><span>public</span><span> </span><span>double</span><span>[] </span><span>randPoint</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>11</div></div><div><span>        </span><span>double</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>sqrt</span><span>(</span><span>Math</span><span>.</span><span>random</span><span><span>()) </span><span>*</span><span> radius;</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>double</span><span><span> </span><span>deg</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>random</span><span><span>() </span><span>*</span><span> </span></span><span>2</span><span>*</span><span>Math</span><span>.</span><span>PI</span><span>;</span></div></div><div><div><div>13</div></div><div><span>        </span><span>double</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> x_center </span><span>+</span><span> len </span><span>*</span><span> </span></span><span>Math</span><span>.</span><span>cos</span><span>(deg);</span></div></div><div><div><div>14</div></div><div><span>        </span><span>double</span><span><span> </span><span>y</span><span> </span></span><span><span>=</span><span> y_center </span><span>+</span><span> len </span><span>*</span><span> </span></span><span>Math</span><span>.</span><span>sin</span><span>(deg);</span></div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> </span><span>new</span><span> </span><span>double</span><span>[]{x, y};</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>/**</span></div></div><div><div><div>20</div></div><div><span><span> </span></span><span>* Your Solution object will be instantiated and called as such:</span></div></div><div><div><div>21</div></div><div><span><span> </span></span><span>* Solution obj = new Solution(radius, x_center, y_center);</span></div></div><div><div><div>22</div></div><div><span><span> </span></span><span>* double[] param_1 = obj.randPoint();</span></div></div><div><div><div>23</div></div><div><span><span> </span></span><span>*/</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>479. Largest Palindrome Product<a href="#479-largest-palindrome-product"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/largest-palindrome-product/" target="_blank">https://leetcode.com/problems/largest-palindrome-product/</a></p><hr /><p>对于每个<code>n</code>，确定上下界，从大到小穷举回文数<code>pal</code>，再检查<code>sqrt(pal)</code>与上界之间的数是否存在可以被<code>pal</code>整除的<code>i</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>largestPalindrome</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>9</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>long</span><span><span> </span><span>upper</span><span> </span></span><span><span>=</span><span> (</span></span><span>long</span><span>)(</span><span>Math</span><span>.</span><span>pow</span><span>(</span><span>10</span><span><span>, n) </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>7</div></div><div><span>        </span><span>long</span><span><span> </span><span>lower</span><span> </span></span><span><span>=</span><span> upper</span><span>/</span></span><span>10</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>long</span><span><span> </span><span>half</span><span> </span></span><span><span>=</span><span> upper </span><span>*</span><span> upper </span><span>/</span><span> (</span></span><span>long</span><span>)</span><span>Math</span><span>.</span><span>pow</span><span>(</span><span>10</span><span>, n);</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>while</span><span><span> (half </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>// For each palindrome number pal, it checks if the number can be divided by a number i with n digits</span></div></div><div><div><div>12</div></div><div><span>            </span><span>long</span><span><span> </span><span>pal</span><span> </span></span><span><span>=</span><span> </span></span><span>Long</span><span>.</span><span>parseLong</span><span><span>(half </span><span>+</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>().</span><span>append</span><span>(half--).</span><span>reverse</span><span>().</span><span>toString</span><span>());</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>            </span><span>// As it's in descending order, the first number that meets this check is the largest palindrome number we want</span></div></div><div><div><div>15</div></div><div><span>            </span><span>for</span><span> (</span><span>long</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> upper; i </span><span>*</span><span> i </span><span>&gt;=</span><span> pal </span><span>&amp;&amp;</span><span> i </span><span>&gt;</span><span> lower; i--) {</span></span></div></div><div><div><div>16</div></div><div><span>                </span><span>if</span><span><span> (pal </span><span>%</span><span> i </span><span>==</span><span> </span></span><span>0</span><span>)  {</span></div></div><div><div><div>17</div></div><div><span>                    </span><span>return</span><span> (</span><span>int</span><span><span>) (pal </span><span>%</span><span> </span></span><span>1337</span><span>);</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>half--;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>480. Sliding Window Median<a href="#480-sliding-window-median"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/sliding-window-median/" target="_blank">https://leetcode.com/problems/sliding-window-median/</a></p><hr /><p>使用两个优先队列，一个<code>small</code>用于降序存窗口中较小一半的数，一个<code>large</code>用于升序存窗口中较大一半的数，这样可以保证无论窗口长度是奇数还是偶数，中位数都可以通过优先队列的头元素快速求出。之后向前移动窗口时，需要把即将进入窗口的数和当前<code>small</code>中的最大值进行比较，进而判断这个数应该加到<code>small</code>还是<code>large</code>中。因为新加入的数可能会导致两个优先队列长度失衡，因此维护一个<code>balance</code>变量用于动态平衡两个队列的长度。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>double</span><span>[] </span><span>medianSlidingWindow</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (k </span><span>&gt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>||</span><span> k </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>double</span><span>[</span><span>0</span><span>];</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// priority queue will store [array index, array element]</span></div></div><div><div><div>8</div></div><div><span>        </span><span>Queue</span><span>&lt;</span><span>int</span><span><span>[]&gt; </span><span>small</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;&gt;((n1, n2) </span><span>-&gt;</span><span> n1[</span><span>1</span><span><span>] </span><span>==</span><span> n2[</span></span><span>1</span><span>] </span><span>?</span><span> </span><span>0</span><span> </span><span>:</span><span> n2[</span><span>1</span><span><span>] </span><span>&gt;</span><span> n1[</span></span><span>1</span><span>] </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span><span> </span><span>-</span></span><span>1</span><span>); </span><span>// descending</span></div></div><div><div><div>9</div></div><div><span>        </span><span>Queue</span><span>&lt;</span><span>int</span><span><span>[]&gt; </span><span>large</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;&gt;((n1, n2) </span><span>-&gt;</span><span> n1[</span><span>1</span><span><span>] </span><span>==</span><span> n2[</span></span><span>1</span><span>] </span><span>?</span><span> </span><span>0</span><span> </span><span>:</span><span> n1[</span><span>1</span><span><span>] </span><span>&gt;</span><span> n2[</span></span><span>1</span><span>] </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span><span> </span><span>-</span></span><span>1</span><span>); </span><span>// ascending</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>double</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>double</span><span>[</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> k </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> k; i++) {</span></span></div></div><div><div><div>13</div></div><div><span>            </span><span>large</span><span>.</span><span>offer</span><span>(</span><span>new</span><span> </span><span>int</span><span>[]{i, nums[i]});</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> (k </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>/</span><span> </span></span><span>2</span><span>; i++) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>small</span><span>.</span><span>offer</span><span>(</span><span>large</span><span>.</span><span>poll</span><span>());</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>int</span><span><span> </span><span>balance</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>result</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>// get current median</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>result[i] </span><span>=</span><span> </span><span>small</span><span>.</span><span>peek</span><span>()[</span><span>1</span><span>];</span></div></div><div><div><div>23</div></div><div><span>            </span><span>if</span><span><span> (k </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>result[i] </span><span>=</span><span> (result[i] </span><span>+</span><span> </span><span>large</span><span>.</span><span>peek</span><span>()[</span><span>1</span><span><span>]) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>==</span><span> </span></span><span>result</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>28</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>            </span><span>// decide the incoming number should go to small or large</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>balance </span><span>+=</span><span> nums[i] </span><span>&lt;=</span><span> </span><span>small</span><span>.</span><span>peek</span><span>()[</span><span>1</span><span>] </span><span>?</span><span><span> </span><span>-</span></span><span>1</span><span> </span><span>:</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>33</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>small</span><span>.</span><span>isEmpty</span><span><span>() </span><span>&amp;&amp;</span><span> nums[i </span><span>+</span><span> k] </span><span>&lt;</span><span> </span></span><span>small</span><span>.</span><span>peek</span><span>()[</span><span>1</span><span>]) {</span></div></div><div><div><div>34</div></div><div><span>                </span><span>small</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>int</span><span><span>[]{i </span><span>+</span><span> k, nums[i </span><span>+</span><span> k]});</span></span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>balance++;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>37</div></div><div><span>                </span><span>large</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>int</span><span><span>[]{i </span><span>+</span><span> k, nums[i </span><span>+</span><span> k]});</span></span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>balance--;</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>            </span><span>// how many numbers should one queue offers to another queue</span></div></div><div><div><div>42</div></div><div><span>            </span><span>if</span><span><span> (balance </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>43</div></div><div><span>                </span><span>large</span><span>.</span><span>offer</span><span>(</span><span>small</span><span>.</span><span>poll</span><span>());</span></div></div><div><div><div>44</div></div><div><span><span>                </span></span><span>balance </span><span>-=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span>            </span><span>if</span><span><span> (balance </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>47</div></div><div><span>                </span><span>small</span><span>.</span><span>offer</span><span>(</span><span>large</span><span>.</span><span>poll</span><span>());</span></div></div><div><div><div>48</div></div><div><span><span>                </span></span><span>balance </span><span>+=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>            </span><span>// move forward the sliding window</span></div></div><div><div><div>52</div></div><div><span>            </span><span>while</span><span><span> (</span><span>!</span></span><span>small</span><span>.</span><span>isEmpty</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>small</span><span>.</span><span>peek</span><span>()[</span><span>0</span><span><span>] </span><span>&lt;=</span><span> i) {</span></span></div></div><div><div><div>53</div></div><div><span>                </span><span>small</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>54</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span>            </span><span>while</span><span><span> (</span><span>!</span></span><span>large</span><span>.</span><span>isEmpty</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>large</span><span>.</span><span>peek</span><span>()[</span><span>0</span><span><span>] </span><span>&lt;=</span><span> i) {</span></span></div></div><div><div><div>56</div></div><div><span>                </span><span>large</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>57</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>58</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>59</div></div><div>
</div></div><div><div><div>60</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>61</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>62</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>481. Magical String<a href="#481-magical-string"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/magical-string/" target="_blank">https://leetcode.com/problems/magical-string/</a></p><hr /><p>双指针 + 数组，具体使用参考注释。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>magicalString</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>&lt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>&lt;=</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// +1 to avoid overflow because the last round head might points to a number 2</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>a</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[n </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>a[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>a[</span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>a[</span><span>2</span><span><span>] </span><span>=</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// head points to the number which will be used to generate new numbers</span></div></div><div><div><div>17</div></div><div><span>        </span><span>// tail points to the next empty position to put the new number</span></div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span> </span><span>head</span><span> </span></span><span><span>=</span><span> </span></span><span>2</span><span><span>, tail </span><span>=</span><span> </span></span><span>3</span><span><span>, num </span><span>=</span><span> </span></span><span>1</span><span><span>, result </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>while</span><span><span> (tail </span><span>&lt;</span><span> n) {</span></span></div></div><div><div><div>21</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> a[head]; i++) {</span></span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>a[tail] </span><span>=</span><span> num;</span></div></div><div><div><div>23</div></div><div><span>                </span><span>if</span><span><span> (num </span><span>==</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> tail </span><span>&lt;</span><span> n) {</span></span></div></div><div><div><div>24</div></div><div><span><span>                    </span></span><span>result++;</span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>tail++;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>            </span><span>// flip number back and forth between 1 and 2</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>num </span><span>=</span><span> num </span><span>^</span><span> </span><span>3</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>head++;</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>482. License Key Formatting<a href="#482-license-key-formatting"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/license-key-formatting/" target="_blank">https://leetcode.com/problems/license-key-formatting/</a></p><hr /><p>把原始字符串中的<code>'-'</code>去掉，之后计算长度，把<code>mod K</code>的余数部分放在第一部分，其他每个部分都是<code>K</code>的长度，中间用<code>'-'</code>间隔。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>licenseKeyFormatting</span><span>(</span><span>String</span><span><span> </span><span>S</span><span>, </span></span><span>int</span><span><span> </span><span>K</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>String</span><span><span> </span><span>s</span><span> </span></span><span><span>=</span><span> </span></span><span>S</span><span>.</span><span>replace</span><span>(</span><span>"-"</span><span>, </span><span>""</span><span>);</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>5</div></div><div><span>        </span><span>if</span><span> (</span><span>S</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> len </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>return</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>// the first group could be shorter than K</span></div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span> </span><span>firstLen</span><span> </span></span><span><span>=</span><span> len </span><span>%</span><span> K;</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span><span> (firstLen </span><span>&gt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> firstLen; i++) {</span></span></div></div><div><div><div>15</div></div><div><span>                </span><span>char</span><span><span> </span><span>ch</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>16</div></div><div><span>                </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>Character</span><span>.</span><span>toUpperCase</span><span>(ch));</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>"-"</span><span>);</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> firstLen; i </span><span>&lt;</span><span> len; i </span><span>=</span><span> i </span><span>+</span><span> K) {</span></span></div></div><div><div><div>22</div></div><div><span>            </span><span>// after K characters, add a hyphen</span></div></div><div><div><div>23</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> K; j++) {</span></span></div></div><div><div><div>24</div></div><div><span>                </span><span>char</span><span><span> </span><span>ch</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span><span>(i </span><span>+</span><span> j);</span></span></div></div><div><div><div>25</div></div><div><span>                </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>Character</span><span>.</span><span>toUpperCase</span><span>(ch));</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>"-"</span><span>);</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// remove last hyphen</span></div></div><div><div><div>31</div></div><div><span>        </span><span>sb</span><span>.</span><span>setLength</span><span>(</span><span>sb</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>32</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>483. Smallest Good Base<a href="#483-smallest-good-base"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/smallest-good-base/" target="_blank">https://leetcode.com/problems/smallest-good-base/</a></p><hr /><p>算出最大的可能次幂，然后向下循环缩小范围。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>smallestGoodBase</span><span>(</span><span>String</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>long</span><span><span> </span><span>num</span><span> </span></span><span><span>=</span><span> </span></span><span>Long</span><span>.</span><span>parseLong</span><span>(n);</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// smallest base is 2 so our m must be between 2 and log2n</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>maxPower</span><span> </span></span><span><span>=</span><span> (</span></span><span>int</span><span>)(</span><span>Math</span><span>.</span><span>log</span><span>((</span><span>double</span><span><span>)num) </span><span>/</span><span> </span></span><span>Math</span><span>.</span><span>log</span><span>(</span><span>2</span><span>));</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> maxPower; i </span><span>&gt;=</span><span> </span></span><span>2</span><span>; i--) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>// ⌊i-th root of num⌋ is the only candidate that needs to be tested</span></div></div><div><div><div>10</div></div><div><span>            </span><span>int</span><span><span> </span><span>root</span><span> </span></span><span><span>=</span><span> (</span></span><span>int</span><span>)</span><span>Math</span><span>.</span><span>pow</span><span>(num, </span><span>1.0</span><span><span> </span><span>/</span><span> i);</span></span></div></div><div><div><div>11</div></div><div><span>            </span><span>long</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div><span>            </span><span>long</span><span><span> </span><span>term</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>13</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;=</span><span> i; j++) {</span></span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>term </span><span>*=</span><span> root;</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>sum </span><span>+=</span><span> term;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>            </span><span>// (i^(j+1) - 1) / (i - 1) = num</span></div></div><div><div><div>19</div></div><div><span>            </span><span>if</span><span><span> (sum </span><span>==</span><span> num) {</span></span></div></div><div><div><div>20</div></div><div><span>                </span><span>return</span><span> </span><span>Integer</span><span>.</span><span>toString</span><span>(root);</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// else result is num - 1</span></div></div><div><div><div>25</div></div><div><span>        </span><span>return</span><span> </span><span>Long</span><span>.</span><span>toString</span><span><span>(num </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>484. Find Permutation<a href="#484-find-permutation"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-permutation/" target="_blank">https://leetcode.com/problems/find-permutation/</a></p><hr /><p>先初始化一个有序的序列，之后把所有含<code>'D'</code>的序列区间进行颠倒，颠倒时注意是头尾双指针两两配对交换，交换完后移动指针。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>findPermutation</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[</span><span>0</span><span>];</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>sorted</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[n </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>sorted[i] </span><span>=</span><span> i </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>14</div></div><div><span>        </span><span>while</span><span><span> (right </span><span>&lt;</span><span> n) {</span></span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(right) </span><span>==</span><span> </span></span><span>'I'</span><span>) {</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>right++;</span></div></div><div><div><div>17</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>            </span><span>// find first 'D' and set as left</span></div></div><div><div><div>21</div></div><div><span>            </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> right;</span></span></div></div><div><div><div>22</div></div><div><span>            </span><span>while</span><span><span> (right </span><span>&lt;</span><span> n </span><span>&amp;&amp;</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span><span>(right) </span><span>==</span><span> </span></span><span>'D'</span><span>) {</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>right++;</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>            </span><span>// swap intervals with all 'D's</span></div></div><div><div><div>27</div></div><div><span>            </span><span>reverse</span><span>(sorted, left, right);</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>return</span><span> sorted;</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>    </span><span>// swap all pairs of number in [left, right]</span></div></div><div><div><div>34</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>reverse</span><span>(</span><span>int</span><span><span>[] </span><span>arr</span><span>, </span></span><span>int</span><span><span> </span><span>left</span><span>, </span></span><span>int</span><span><span> </span><span>right</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>35</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>36</div></div><div><span>            </span><span>int</span><span><span> </span><span>tmp</span><span> </span></span><span><span>=</span><span> arr[left];</span></span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>arr[left] </span><span>=</span><span> arr[right];</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>arr[right] </span><span>=</span><span> tmp;</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>left++;</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>right--;</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>485. Max Consecutive Ones<a href="#485-max-consecutive-ones"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/max-consecutive-ones/" target="_blank">https://leetcode.com/problems/max-consecutive-ones/</a></p><hr /><p>遇到1就计数增加，反之检查是否需要更新最大值。注意循环结束后仍然要检查一次。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findMaxConsecutiveOnes</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>max</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, count </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span></span><span>:</span><span> nums) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>7</div></div><div><span><span>                </span></span><span>count++;</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>max </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(max, count);</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>count </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(max, count);</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>486. Predict the Winner<a href="#486-predict-the-winner"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/predict-the-winner/" target="_blank">https://leetcode.com/problems/predict-the-winner/</a></p><hr /><p>使用动态规划，<code>dp[i][j]</code>表示如果第一个玩家先手，能够从<code>nums[i, j]</code>之间比第二个玩家多拿多少数字。如果先手玩家拿了<code>nums[i]</code>，剩下的<code>nums[i+1, j]</code>里面就会生成<code>dp[i+1][j]</code>，则第一个玩家比第二个玩家多的部分就应该是<code>nums[i] + dp[i+1][j]</code>。</p><p>然而，注意到一旦第一个玩家拿了<code>nums[i]</code>，<code>nums[i+1, j]</code>中就变成了第二个玩家先手，因此此时我们看到的<code>dp[i+1][j]</code>实际上是第二个玩家在<code>nums[i+1, j]</code>中比第一个玩家多拿了多少数字（因为两个人都是用最优策略在玩游戏，因此如果把两个人视为一个整体，取数字的顺序一定是固定的，只是谁先手的差异）。</p><p>因此，如果先手玩家拿<code>nums[i]</code>，<code>dp[i][j]</code>是<code>nums[i] - dp[i+1][j]</code>，即抵消了子区间内对方多拿的数字。同理，如果先手玩家拿<code>nums[j]</code>，<code>dp[i][j]</code>是<code>nums[j] - dp[i][j-1]</code>，这两种取法选择较大的一种作为最终策略。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>PredictTheWinner</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// dp[i][j]: how much more scores that the first player will get from i to j than the second player</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n][n];</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>dp[i][i] </span><span>=</span><span> nums[i];</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>len</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; len </span><span>&lt;</span><span> n; len++) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n </span><span>-</span><span> len; i++) {</span></span></div></div><div><div><div>13</div></div><div><span>                </span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i </span><span>+</span><span> len;</span></span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>                </span><span>// first player takes num[i], and second player starts first to result dp[i + 1, j]</span></div></div><div><div><div>16</div></div><div><span>                </span><span>// or similarily, first player takes num[j], and second player starts first to result dp[i, j - 1]</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>dp[i][j] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(nums[i] </span><span>-</span><span> dp[i </span><span>+</span><span> </span></span><span>1</span><span><span>][j], nums[j] </span><span>-</span><span> dp[i][j </span><span>-</span><span> </span></span><span>1</span><span>]);</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> dp[</span><span>0</span><span><span>][n </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>&gt;=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>487. Max Consecutive Ones II<a href="#487-max-consecutive-ones-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/max-consecutive-ones-ii/" target="_blank">https://leetcode.com/problems/max-consecutive-ones-ii/</a></p><hr /><p>使用两个变量<code>zeroLeft</code>和<code>zeroRight</code>，<code>zeroRight</code>表示当前遍历时连续遇到的1的个数，遇到0就清零；而<code>zeroLeft</code>则在遇到0时才更新，把此前<code>zeroRight</code>赋值给<code>zeroLeft</code>，这个值包含了此前连续的1的个数 + 1（当前的0可以翻转成1）。最大值由<code>zeroLeft + zeroRight</code>得到。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findMaxConsecutiveOnes</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, zeroLeft </span><span>=</span><span> </span></span><span>0</span><span><span>, zeroRight </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>zeroRight++;</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span><span> (nums[i] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>zeroLeft </span><span>=</span><span> zeroRight;</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>zeroRight </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, zeroLeft </span><span>+</span><span> zeroRight);</span></span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>对于follow-up，需要使用一个queue存储所有0的下标，然后用双指针<code>low</code>和<code>high</code>计算最大的连续1区间长度。只要还在flip的上限范围内，就只需要更新<code>high</code>，不需要更新<code>low</code>；而一旦超出上限，就必须把最早的0的下标弹出，更新<code>low</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>int</span><span> </span><span>findMaxConsecutiveOnes</span><span>(</span><span>int</span><span>[] nums) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>// flip at most k zero</span></div></div><div><div><div>3</div></div><div><span>    </span><span>int</span><span> result </span><span><span>=</span><span> </span></span><span>0</span><span><span>,</span><span> k </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>Queue</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> zeroIndex </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>6</div></div><div><span>    </span><span>for</span><span> (</span><span>int</span><span> low </span><span><span>=</span><span> </span></span><span>0</span><span><span>,</span><span> high </span><span>=</span><span> </span></span><span>0</span><span><span>;</span><span> high </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span>;</span><span> high</span><span>++</span><span>) {</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>if</span><span><span> (nums[high] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>zeroIndex</span><span>.</span><span>offer</span><span>(high);</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>// eject the earliest 0's index</span></div></div><div><div><div>12</div></div><div><span>        </span><span>if</span><span> (</span><span>zeroIndex</span><span>.</span><span>size</span><span><span>()</span><span> </span><span>&gt;</span><span> k) {</span></span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>low </span><span>=</span><span> </span><span>zeroIndex</span><span>.</span><span>poll</span><span><span>()</span><span> </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, high </span><span>-</span><span> low </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>return</span><span><span> result</span><span>;</span></span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>488. Zuma Game<a href="#488-zuma-game"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/zuma-game/" target="_blank">https://leetcode.com/problems/zuma-game/</a></p><hr /><p>分类讨论，单球+2/双球+1/双球之间插1异色球的情况。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> result </span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] map </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>26</span><span><span>]</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>char</span><span>[] colors </span><span><span>=</span><span> {</span></span><span>'R'</span><span><span>,</span><span> </span></span><span>'Y'</span><span><span>,</span><span> </span></span><span>'B'</span><span><span>,</span><span> </span></span><span>'G'</span><span><span>,</span><span> </span></span><span>'W'</span><span><span>}</span><span>;</span></span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findMinStep</span><span>(</span><span>String</span><span><span> </span><span>board</span><span>, </span></span><span>String</span><span><span> </span><span>hand</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>hand</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>map[</span><span>hand</span><span>.</span><span>charAt</span><span><span>(i) </span><span>-</span><span> </span></span><span>'A'</span><span>]++;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>        </span><span>dfs</span><span>(</span><span>new</span><span> </span><span>StringBuilder</span><span>(board), </span><span>0</span><span>);</span></div></div><div><div><div>11</div></div><div><span>        </span><span>return</span><span><span> result </span><span>==</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span> </span><span>?</span><span><span> </span><span>-</span></span><span>1</span><span> </span><span>:</span><span> result;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>StringBuilder</span><span><span> </span><span>board</span><span>, </span></span><span>int</span><span><span> </span><span>step</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>15</div></div><div><span>        </span><span>// skip rest of the dfs if step is already too big, or update the min step</span></div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span><span> (step </span><span>&gt;=</span><span> result) {</span></span></div></div><div><div><div>17</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span> (</span><span>board</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(step, result);</span></div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>board</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>board</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>27</div></div><div><span>            </span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i;</span></span></div></div><div><div><div>28</div></div><div><span>            </span><span>while</span><span><span> (j </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>&lt;</span><span> </span></span><span>board</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>board</span><span>.</span><span>charAt</span><span><span>(j </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>==</span><span> c) {</span></span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>j++;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>            </span><span>if</span><span><span> (j </span><span>==</span><span> i </span><span>&amp;&amp;</span><span> map[c </span><span>-</span><span> </span></span><span>'A'</span><span><span>] </span><span>&gt;=</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>33</div></div><div><span>                </span><span>// single ball, insert two same color balls</span></div></div><div><div><div>34</div></div><div><span>                </span><span>StringBuilder</span><span><span> </span><span>tmp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>(board);</span></div></div><div><div><div>35</div></div><div><span>                </span><span>tmp</span><span>.</span><span>insert</span><span><span>(i, c </span><span>+</span><span> </span></span><span>""</span><span><span> </span><span>+</span><span> c);</span></span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>map[c </span><span>-</span><span> </span><span>'A'</span><span><span>] </span><span>-=</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>37</div></div><div><span>                </span><span>dfs</span><span>(</span><span>eliminate</span><span><span>(tmp), step </span><span>+</span><span> </span></span><span>2</span><span>);</span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>map[c </span><span>-</span><span> </span><span>'A'</span><span><span>] </span><span>+=</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (j </span><span>==</span><span> i </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>40</div></div><div><span>                </span><span>// two adjacent balls with same color</span></div></div><div><div><div>41</div></div><div><span>                </span><span>// insert a same color ball</span></div></div><div><div><div>42</div></div><div><span>                </span><span>if</span><span><span> (map[c </span><span>-</span><span> </span></span><span>'A'</span><span><span>] </span><span>&gt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>43</div></div><div><span>                    </span><span>StringBuilder</span><span><span> </span><span>tmp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>(board);</span></div></div><div><div><div>44</div></div><div><span>                    </span><span>tmp</span><span>.</span><span>insert</span><span>(i, c);</span></div></div><div><div><div>45</div></div><div><span><span>                    </span></span><span>map[c </span><span>-</span><span> </span><span>'A'</span><span>]--;</span></div></div><div><div><div>46</div></div><div><span>                    </span><span>dfs</span><span>(</span><span>eliminate</span><span><span>(tmp), step </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>47</div></div><div><span><span>                    </span></span><span>map[c </span><span>-</span><span> </span><span>'A'</span><span>]++;</span></div></div><div><div><div>48</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>                </span><span>// insert a different color ball between these two adjacent balls</span></div></div><div><div><div>51</div></div><div><span>                </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>color</span><span> </span></span><span>:</span><span> colors) {</span></div></div><div><div><div>52</div></div><div><span>                    </span><span>if</span><span><span> (color </span><span>==</span><span> c) {</span></span></div></div><div><div><div>53</div></div><div><span>                        </span><span>continue</span><span>;</span></div></div><div><div><div>54</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span>                    </span><span>if</span><span><span> (map[color </span><span>-</span><span> </span></span><span>'A'</span><span><span>] </span><span>&gt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>56</div></div><div><span>                        </span><span>StringBuilder</span><span><span> </span><span>tmp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>(board);</span></div></div><div><div><div>57</div></div><div><span>                        </span><span>tmp</span><span>.</span><span>insert</span><span><span>(i </span><span>+</span><span> </span></span><span>1</span><span>, color);</span></div></div><div><div><div>58</div></div><div><span><span>                        </span></span><span>map[color </span><span>-</span><span> </span><span>'A'</span><span>]--;</span></div></div><div><div><div>59</div></div><div><span>                        </span><span>dfs</span><span>(</span><span>eliminate</span><span><span>(tmp), step </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>60</div></div><div><span><span>                        </span></span><span>map[color </span><span>-</span><span> </span><span>'A'</span><span>]++;</span></div></div><div><div><div>61</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>62</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>63</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>64</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>65</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>66</div></div><div>
</div></div><div><div><div>67</div></div><div><span>    </span><span>private</span><span> </span><span>StringBuilder</span><span> </span><span>eliminate</span><span>(</span><span>StringBuilder</span><span><span> </span><span>sb</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>68</div></div><div><span>        </span><span>boolean</span><span><span> </span><span>flag</span><span> </span></span><span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>69</div></div><div><span>        </span><span>while</span><span> (flag) {</span></div></div><div><div><div>70</div></div><div><span><span>            </span></span><span>flag </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>71</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>sb</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>72</div></div><div><span>                </span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>73</div></div><div><span>                </span><span>while</span><span><span> (j </span><span>&lt;</span><span> </span></span><span>sb</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>sb</span><span>.</span><span>charAt</span><span><span>(j) </span><span>==</span><span> </span></span><span>sb</span><span>.</span><span>charAt</span><span>(i)) {</span></div></div><div><div><div>74</div></div><div><span><span>                    </span></span><span>j++;</span></div></div><div><div><div>75</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>76</div></div><div>
</div></div><div><div><div>77</div></div><div><span>                </span><span>// remove consecutive balls</span></div></div><div><div><div>78</div></div><div><span>                </span><span>if</span><span><span> (j </span><span>-</span><span> i </span><span>&gt;=</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>79</div></div><div><span>                    </span><span>sb</span><span>.</span><span>delete</span><span>(i, j);</span></div></div><div><div><div>80</div></div><div><span><span>                    </span></span><span>flag </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>81</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>82</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>83</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>84</div></div><div>
</div></div><div><div><div>85</div></div><div><span>        </span><span>return</span><span> sb;</span></div></div><div><div><div>86</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>87</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>489. Robot Room Cleaner<a href="#489-robot-room-cleaner"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/robot-room-cleaner/" target="_blank">https://leetcode.com/problems/robot-room-cleaner/</a></p><hr /><p>回溯算法 + BFS，然后使用一个HashSet存储所有已经走过的方格。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* // This is the robot's control interface.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* // You should not implement it, or speculate about its implementation</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>* interface Robot {</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     // Returns true if the cell in front is open and robot moves into the cell.</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     // Returns false if the cell in front is blocked and robot stays in the current cell.</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     public boolean move();</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     // Robot will stay in the same cell after calling turnLeft/turnRight.</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*     // Each turn will be 90 degrees.</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*     public void turnLeft();</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*     public void turnRight();</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>*     // Clean the current cell.</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*     public void clean();</span></div></div><div><div><div>16</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>17</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>20</div></div><div><span>    </span><span>private</span><span> </span><span>static</span><span> </span><span>int</span><span>[][] DIR </span><span><span>=</span><span> { {</span><span>-</span></span><span>1</span><span><span>,</span><span> </span></span><span>0</span><span><span>}</span><span>,</span><span> {</span></span><span>0</span><span><span>,</span><span> </span></span><span>1</span><span><span>}</span><span>,</span><span> {</span></span><span>1</span><span><span>,</span><span> </span></span><span>0</span><span><span>}</span><span>,</span><span> {</span></span><span>0</span><span><span>,</span><span> </span><span>-</span></span><span>1</span><span><span>} }</span><span>;</span><span> </span></span><span>// UP, RIGHT, DOWN, LEFT</span></div></div><div><div><div>21</div></div><div><span>    </span><span>Set</span><span>&lt;</span><span>Pair</span><span>&lt;</span><span>Integer</span><span><span>,</span><span> </span></span><span>Integer</span><span><span>&gt;&gt;</span><span> visited </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span><span>()</span><span>;</span></span></div></div><div><div><div>22</div></div><div><span>    </span><span>Robot</span><span> robot</span><span>;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>cleanRoom</span><span>(</span><span>Robot</span><span><span> </span><span>robot</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>this</span><span>.</span><span>robot</span><span><span> </span><span>=</span><span> robot;</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>backtrack</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>);</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>    </span><span>// dir: 0: up, 1: right, 2: down, 3: left</span></div></div><div><div><div>30</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>backtrack</span><span>(</span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>, </span></span><span>int</span><span><span> </span><span>dir</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>visited</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>Pair</span><span>(x, y));</span></div></div><div><div><div>32</div></div><div><span>        </span><span>robot</span><span>.</span><span>clean</span><span>();</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>4</span><span>; i++) {</span></div></div><div><div><div>35</div></div><div><span>            </span><span>int</span><span><span> </span><span>newDir</span><span> </span></span><span><span>=</span><span> (dir </span><span>+</span><span> i) </span><span>%</span><span> </span></span><span>4</span><span>;</span></div></div><div><div><div>36</div></div><div><span>            </span><span>int</span><span><span>[] </span><span>move</span><span> </span></span><span><span>=</span><span> </span></span><span>DIR</span><span>[newDir];</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>            </span><span>int</span><span><span> </span><span>newX</span><span> </span></span><span><span>=</span><span> x </span><span>+</span><span> move[</span></span><span>0</span><span>];</span></div></div><div><div><div>39</div></div><div><span>            </span><span>int</span><span><span> </span><span>newY</span><span> </span></span><span><span>=</span><span> y </span><span>+</span><span> move[</span></span><span>1</span><span>];</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span></span><span>visited</span><span>.</span><span>contains</span><span>(</span><span>new</span><span> </span><span>Pair</span><span><span>(newX, newY)) </span><span>&amp;&amp;</span><span> </span></span><span>robot</span><span>.</span><span>move</span><span>()) {</span></div></div><div><div><div>42</div></div><div><span>                </span><span>backtrack</span><span>(newX, newY, newDir);</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>                </span><span>// go back</span></div></div><div><div><div>45</div></div><div><span>                </span><span>robot</span><span>.</span><span>turnRight</span><span>();</span></div></div><div><div><div>46</div></div><div><span>                </span><span>robot</span><span>.</span><span>turnRight</span><span>();</span></div></div><div><div><div>47</div></div><div><span>                </span><span>robot</span><span>.</span><span>move</span><span>();</span></div></div><div><div><div>48</div></div><div><span>                </span><span>robot</span><span>.</span><span>turnRight</span><span>();</span></div></div><div><div><div>49</div></div><div><span>                </span><span>robot</span><span>.</span><span>turnRight</span><span>();</span></div></div><div><div><div>50</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>            </span><span>// turn the robot following chosen direction : clockwise</span></div></div><div><div><div>53</div></div><div><span>            </span><span>robot</span><span>.</span><span>turnRight</span><span>();</span></div></div><div><div><div>54</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>56</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>490. The Maze<a href="#490-the-maze"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/the-maze/" target="_blank">https://leetcode.com/problems/the-maze/</a></p><hr /><p>使用DFS + BFS，先用BFS尝试一个方向，然后在这个方向上一条路走到黑直到撞墙（即判断是否还在迷宫范围内），之后再使用DFS从新的位置开始下一次尝试，直到小球抵达终点。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>static</span><span> </span><span>final</span><span> </span><span>int</span><span>[][] DIRS </span><span><span>=</span><span> { {</span></span><span>1</span><span>,</span><span>0</span><span><span>}</span><span>,</span><span>{</span><span>-</span></span><span>1</span><span>,</span><span>0</span><span><span>}</span><span>,</span><span>{</span></span><span>0</span><span>,</span><span>1</span><span><span>}</span><span>,</span><span>{</span></span><span>0</span><span><span>,</span><span>-</span></span><span>1</span><span><span>} }</span><span>;</span></span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>hasPath</span><span>(</span><span>int</span><span><span>[][] </span><span>maze</span><span>, </span></span><span>int</span><span><span>[] </span><span>start</span><span>, </span></span><span>int</span><span><span>[] </span><span>destination</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>boolean</span><span><span>[][] </span><span>visited</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span>[</span><span>maze</span><span>.</span><span>length</span><span>][maze[</span><span>0</span><span>].</span><span>length</span><span>];</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> </span><span>dfs</span><span>(maze, start, destination, visited);</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span>[][] </span><span>maze</span><span>, </span></span><span>int</span><span><span>[] </span><span>start</span><span>, </span></span><span>int</span><span><span>[] </span><span>end</span><span>, </span></span><span>boolean</span><span><span>[][] </span><span>visited</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>// start and end points are the same</span></div></div><div><div><div>11</div></div><div><span>        </span><span>if</span><span> (start[</span><span>0</span><span><span>] </span><span>==</span><span> end[</span></span><span>0</span><span><span>] </span><span>&amp;&amp;</span><span> start[</span></span><span>1</span><span><span>] </span><span>==</span><span> end[</span></span><span>1</span><span>]) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>// already visited grid</span></div></div><div><div><div>16</div></div><div><span>        </span><span>if</span><span> (visited[start[</span><span>0</span><span>]][start[</span><span>1</span><span>]]) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>visited[start[</span><span>0</span><span>]][start[</span><span>1</span><span><span>]] </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>21</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>dir</span><span> </span></span><span>:</span><span> DIRS) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>int</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> dir[</span></span><span>0</span><span><span>] </span><span>+</span><span> start[</span></span><span>0</span><span>];</span></div></div><div><div><div>23</div></div><div><span>            </span><span>int</span><span><span> </span><span>y</span><span> </span></span><span><span>=</span><span> dir[</span></span><span>1</span><span><span>] </span><span>+</span><span> start[</span></span><span>1</span><span>];</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>            </span><span>// ball always runs until it hit a wall</span></div></div><div><div><div>26</div></div><div><span>            </span><span>while</span><span> (</span><span>isValid</span><span><span>(maze, x, y) </span><span>&amp;&amp;</span><span> maze[x][y] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>x </span><span>+=</span><span> dir[</span><span>0</span><span>];</span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>y </span><span>+=</span><span> dir[</span><span>1</span><span>];</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>x </span><span>-=</span><span> dir[</span><span>0</span><span>];</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>y </span><span>-=</span><span> dir[</span><span>1</span><span>];</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>            </span><span>// current grid is unvisited, try subsequent dfs</span></div></div><div><div><div>34</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span><span>visited[x][y]) {</span></span></div></div><div><div><div>35</div></div><div><span>                </span><span>if</span><span> (</span><span>dfs</span><span>(maze, </span><span>new</span><span> </span><span>int</span><span>[]{x, y}, end, visited)) {</span></div></div><div><div><div>36</div></div><div><span>                    </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>    </span><span>// still in maze's range</span></div></div><div><div><div>45</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isValid</span><span>(</span><span>int</span><span><span>[][] </span><span>maze</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>46</div></div><div><span>        </span><span>return</span><span><span> x </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> y </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> x </span><span>&lt;</span><span> </span></span><span>maze</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> y </span><span>&lt;</span><span> maze[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>47</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>491. Increasing Subsequences<a href="#491-increasing-subsequences"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/increasing-subsequences/" target="_blank">https://leetcode.com/problems/increasing-subsequences/</a></p><hr /><p>回溯算法，分类讨论。如果当前数字比此前的数字更大，可以把它添加到当前list中，然后dfs尝试之后的数组区间，直到访问到数组尾。而另一种情况下，即便当前数字比此前数字更大，我们也不一定用这个数字，而是向后继续搜索找到另一个递增数字。所以综合起来，共有2种触发dfs的方式。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt;</span><span> </span></span><span>findSubsequences</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>dfs</span><span>(result, nums, </span><span>0</span><span>, </span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;());</span></div></div><div><div><div>5</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>result</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>, </span></span><span>int</span><span><span> </span><span>pre</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>cur</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span>        </span><span>// reach the end of nums, add current list to result</span></div></div><div><div><div>10</div></div><div><span>        </span><span>if</span><span><span> (index </span><span>==</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>size</span><span><span>() </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>ArrayList</span><span>(cur));</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// current number is larger than previous number, add to current list</span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (nums[index] </span><span>&gt;=</span><span> pre) {</span></span></div></div><div><div><div>19</div></div><div><span>            </span><span>cur</span><span>.</span><span>add</span><span>(nums[index]);</span></div></div><div><div><div>20</div></div><div><span>            </span><span>dfs</span><span><span>(result, nums, index </span><span>+</span><span> </span></span><span>1</span><span>, nums[index], cur);</span></div></div><div><div><div>21</div></div><div><span>            </span><span>cur</span><span>.</span><span>remove</span><span>(</span><span>cur</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// may or may not use current number, so try next number</span></div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span><span> (nums[index] </span><span>!=</span><span> pre) {</span></span></div></div><div><div><div>26</div></div><div><span>            </span><span>dfs</span><span><span>(result, nums, index </span><span>+</span><span> </span></span><span>1</span><span>, pre, cur);</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>492. Construct the Rectangle<a href="#492-construct-the-rectangle"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/construct-the-rectangle/" target="_blank">https://leetcode.com/problems/construct-the-rectangle/</a></p><hr /><p>通过开方可以快速定位到离<code>sqrt(area)</code>最近的质因数。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>constructRectangle</span><span>(</span><span>int</span><span><span> </span><span>area</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>width</span><span> </span></span><span><span>=</span><span> (</span></span><span>int</span><span>)</span><span>Math</span><span>.</span><span>sqrt</span><span>(area);</span></div></div><div><div><div>4</div></div><div><span>        </span><span>while</span><span><span> (area </span><span>%</span><span> width </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>width--;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>        </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span><span>[]{area </span><span>/</span><span> width, width};</span></span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>493. Reverse Pairs<a href="#493-reverse-pairs"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reverse-pairs/" target="_blank">https://leetcode.com/problems/reverse-pairs/</a></p><hr /><p>归并排序，在归并的同时搜索reverse pairs。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>reversePairs</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span><span> nums </span><span>==</span><span> </span></span><span>null</span><span> </span><span>?</span><span> </span><span>0</span><span> </span><span>:</span><span> </span><span>mergeSort</span><span>(nums, </span><span>0</span><span>, </span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>mergeSort</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>start</span><span>, </span></span><span>int</span><span><span> </span><span>end</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span>        </span><span>if</span><span><span> (start </span><span>&gt;=</span><span> end) {</span></span></div></div><div><div><div>8</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> start </span><span>+</span><span> ((end </span><span>-</span><span> start) </span><span>&gt;&gt;</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>mergeSort</span><span><span>(nums, start, mid) </span><span>+</span><span> </span></span><span>mergeSort</span><span><span>(nums, mid </span><span>+</span><span> </span></span><span>1</span><span>, end);</span></div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>cache</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[end </span><span>-</span><span> start </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> mid </span><span>+</span><span> </span></span><span>1</span><span><span>, c </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> start, j </span><span>=</span><span> mid </span><span>+</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> mid; i++, c++) {</span></span></div></div><div><div><div>17</div></div><div><span>            </span><span>// find pairs</span></div></div><div><div><div>18</div></div><div><span>            </span><span>while</span><span><span> (j </span><span>&lt;=</span><span> end </span><span>&amp;&amp;</span><span> nums[i] </span><span>&gt;</span><span> </span></span><span>2</span><span><span> </span><span>*</span><span> (</span></span><span>long</span><span>)nums[j]) {</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>j++;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>// find numbers smaller than nums[i] and copy to cache</span></div></div><div><div><div>23</div></div><div><span>            </span><span>while</span><span><span> (k </span><span>&lt;=</span><span> end </span><span>&amp;&amp;</span><span> nums[k] </span><span>&lt;</span><span> nums[i]) {</span></span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>cache[c] </span><span>=</span><span> nums[k];</span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>c++;</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>k++;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>cache[c] </span><span>=</span><span> nums[i];</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>// update result</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> j </span><span>-</span><span> (mid </span><span>+</span><span> </span><span>1</span><span>);</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>while</span><span><span> (k </span><span>&lt;=</span><span> end) {</span></span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>cache[c] </span><span>=</span><span> nums[k];</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>c++;</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>k++;</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>System</span><span>.</span><span>arraycopy</span><span>(cache, </span><span>0</span><span><span>, nums, start, end </span><span>-</span><span> start </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>41</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>494. Target Sum<a href="#494-target-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/target-sum/" target="_blank">https://leetcode.com/problems/target-sum/</a></p><hr /><p><code>nums</code>可以拆成两部分来看，一部分用于添加加号，另一部分用于添加负号。如果把这两部分分别用<code>pos</code>和<code>negative</code>两个集合表示，很显然有<code>sum(pos) - sum(negative) = s</code>，化简得到<code>2*sum(pos) = s + sum</code>。根据这个推论，我们可以把问题转化为典型01背包问题，即从<code>nums</code>中找出一个子集（组成<code>pos</code>），使得子集里所有元素的和为<code>(s + sum) / 2</code>。</p><p>寻找子集可以使用动态规划，其中<code>dp[i][j]</code>表示使用前i个数得到目标数<code>j</code>共有几种方式。我们遍历<code>nums</code>中的每个数<code>i</code>，对0到<code>target</code>之间的状态<code>j</code>进行穷举，并分类讨论：</p><ul>
<li>当前的目标<code>j</code>太小，第<code>i</code>个数太大，肯定没有办法选择它，因此<code>dp[i][j]</code>的值仍然与<code>dp[i-1][j]</code>相同</li>
<li>否则，第<code>i</code>个数可选或者可不选。如果不选，与此前的情况一样；如果选了，就相当于之前的<code>i-1</code>个数字总和必须为<code>j - 第i个数的值</code></li>
</ul><p>最后，二维<code>dp</code>可以进一步优化成一维<code>dp</code>，详见注释。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findTargetSumWays</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>sum </span><span>+=</span><span> num;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// too big, too small, or mismatched parity</span></div></div><div><div><div>9</div></div><div><span>        </span><span>if</span><span> (</span><span>Math</span><span>.</span><span>abs</span><span><span>(s) </span><span>&gt;</span><span> sum </span><span>||</span><span> (s</span><span>+</span><span>sum) </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// sum(pos) - sum(negative) = s</span></div></div><div><div><div>14</div></div><div><span>        </span><span>// 2 * sum(pos) = s + sum(negative) + sum(pos) = s + sum</span></div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> </span><span>subsetSum</span><span><span>(nums, (s</span><span>+</span><span>sum) </span><span>/</span><span> </span></span><span>2</span><span>);</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>subsetSum</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>target</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>19</div></div><div><span>//         int[] dp = new int[target + 1];</span></div></div><div><div><div>20</div></div><div><span>//         dp[0] = 1;</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>//         for (int num : nums) {</span></div></div><div><div><div>23</div></div><div><span>//             for (int i = target; i &gt;= num; i--) {</span></div></div><div><div><div>24</div></div><div><span>//                 dp[i] += dp[i - num];</span></div></div><div><div><div>25</div></div><div><span>//             }</span></div></div><div><div><div>26</div></div><div><span>//         }</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>//         return dp[target];</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span><span>][target </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span>][</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>34</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;=</span><span> target; j++) {</span></span></div></div><div><div><div>35</div></div><div><span>                </span><span>if</span><span><span> (j </span><span>&lt;</span><span> nums[i </span><span>-</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>36</div></div><div><span>                    </span><span>// current j is too small, so only possible to repeating all the ways to get sum j by using first i-1 elements</span></div></div><div><div><div>37</div></div><div><span><span>                    </span></span><span>dp[i][j] </span><span>=</span><span> dp[i </span><span>-</span><span> </span><span>1</span><span>][j];</span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>39</div></div><div><span>                    </span><span>// otherwise, could also add nums[i] on top of each way to get sum j-nums[i-1] using first i elements</span></div></div><div><div><div>40</div></div><div><span><span>                    </span></span><span>dp[i][j] </span><span>=</span><span> dp[i </span><span>-</span><span> </span><span>1</span><span><span>][j] </span><span>+</span><span> dp[i </span><span>-</span><span> </span></span><span>1</span><span><span>][j </span><span>-</span><span> nums[i </span><span>-</span><span> </span></span><span>1</span><span>]];</span></div></div><div><div><div>41</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span>        </span><span>return</span><span> dp[</span><span>nums</span><span>.</span><span>length</span><span>][target];</span></div></div><div><div><div>46</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>495. Teemo Attacking<a href="#495-teemo-attacking"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/teemo-attacking/" target="_blank">https://leetcode.com/problems/teemo-attacking/</a></p><hr /><p>除了最后一个数，前面所有数两两之间的间隔都要和<code>duration</code>进行比较，取较小值累加；最后一个数直接累加<code>duration</code>即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findPoisonedDuration</span><span>(</span><span>int</span><span><span>[] </span><span>timeSeries</span><span>, </span></span><span>int</span><span><span> </span><span>duration</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (timeSeries </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>timeSeries</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>timeSeries</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>if</span><span><span> (timeSeries[i </span><span>+</span><span> </span></span><span>1</span><span><span>] </span><span>-</span><span> timeSeries[i] </span><span>&gt;</span><span> duration) {</span></span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> duration;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> timeSeries[i </span><span>+</span><span> </span><span>1</span><span><span>] </span><span>-</span><span> timeSeries[i];</span></span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>result </span><span>+=</span><span> duration;</span></div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>496. Next Greater Element I<a href="#496-next-greater-element-i"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/next-greater-element-i/" target="_blank">https://leetcode.com/problems/next-greater-element-i/</a></p><hr /><p>使用一个HashMap，先储存<code>nums2</code>中所有数字的下标，之后遍历<code>nums1</code>，获取到每个数在<code>nums2</code>中的下标，然后向后搜索看能不能找到比他大的数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>nextGreaterElement</span><span>(</span><span>int</span><span><span>[] </span><span>nums1</span><span>, </span></span><span>int</span><span><span>[] </span><span>nums2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// &lt;number, number index&gt;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>indexMap</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums2</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>indexMap</span><span>.</span><span>put</span><span>(nums2[i], i);</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>nums1</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>result</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>result[i] </span><span>=</span><span> </span><span>getNext</span><span>(nums2, </span><span>indexMap</span><span>.</span><span>get</span><span>(nums1[i]));</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span>// start from current number's index in nums2, and search afterwards</span></div></div><div><div><div>18</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>getNext</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>index</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>int</span><span><span> </span><span>curr</span><span> </span></span><span><span>=</span><span> nums[index];</span></span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> index </span><span>+</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>if</span><span><span> (nums[i] </span><span>&gt;</span><span> curr) {</span></span></div></div><div><div><div>23</div></div><div><span>                </span><span>return</span><span> nums[i];</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>497. Random Point in Non-overlapping Rectangles<a href="#497-random-point-in-non-overlapping-rectangles"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/random-point-in-non-overlapping-rectangles/" target="_blank">https://leetcode.com/problems/random-point-in-non-overlapping-rectangles/</a></p><hr /><p>计算每个矩形的面积，注意因为边界上的点也需要用到，因此边长需要+1。得到每个矩形的面积后用数组存储，然后以总的面积和为上限，得到一个范围，从这个范围内生成一个随机数，利用二分查找找到这个随机数对应的是哪个矩形（即，找到数组内的最小下标<code>left</code>，使得这个随机数落在<code>arr[left - 1]</code>和<code>arr[left]</code>的区间之内）。找到矩形后，再提取这个矩形的坐标，生成范围内的随机坐标点。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>Random</span><span> rand</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[][] re</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> N</span><span>;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> sum</span><span>;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] arr</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>public</span><span> </span><span>Solution</span><span>(</span><span>int</span><span><span>[][] </span><span>rects</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>rand </span><span>=</span><span> </span><span>new</span><span> </span><span>Random</span><span>();</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>re </span><span>=</span><span> rects;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>N </span><span>=</span><span> </span><span>rects</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>arr </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span>[N];</span></div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> N; i++) {</span></span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>arr[i] </span><span>=</span><span> </span><span>area</span><span>(rects[i]);</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// each i in the arr represents a range of (arr[i-1], arr[i]]</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>sum </span><span>=</span><span> arr[</span><span>0</span><span>];</span></div></div><div><div><div>19</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> N; i++) {</span></span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>sum </span><span>+=</span><span> arr[i];</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>arr[i] </span><span>=</span><span> arr[i</span><span>-</span><span>1</span><span><span>] </span><span>+</span><span> arr[i];</span></span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>    </span><span>// boundaries are used, so + 1</span></div></div><div><div><div>26</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>area</span><span>(</span><span>int</span><span><span>[] </span><span>rect</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> (rect[</span><span>2</span><span><span>] </span><span>-</span><span> rect[</span></span><span>0</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>*</span><span> (rect[</span></span><span>3</span><span><span>] </span><span>-</span><span> rect[</span></span><span>1</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>pick</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>num</span><span> </span></span><span><span>=</span><span> </span></span><span>rand</span><span>.</span><span>nextInt</span><span><span>(sum) </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>// find the index l, which is at the left most idx that makes arr[l] &gt;= num (arr[l-1] &lt; num &lt;= arr[l])</span></div></div><div><div><div>34</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>35</div></div><div><span>        </span><span>int</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>36</div></div><div><span>        </span><span>while</span><span><span> (left </span><span>&lt;</span><span> right) {</span></span></div></div><div><div><div>37</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> left </span><span>+</span><span> (right </span><span>-</span><span> left) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>            </span><span>if</span><span><span> (arr[mid] </span><span>&gt;=</span><span> num) {</span></span></div></div><div><div><div>40</div></div><div><span><span>                </span></span><span>right </span><span>=</span><span> mid;</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>left </span><span>=</span><span> mid </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>        </span><span>int</span><span><span> </span><span>x1</span><span> </span></span><span><span>=</span><span> re[left][</span></span><span>0</span><span>];</span></div></div><div><div><div>47</div></div><div><span>        </span><span>int</span><span><span> </span><span>y1</span><span> </span></span><span><span>=</span><span> re[left][</span></span><span>1</span><span>];</span></div></div><div><div><div>48</div></div><div><span>        </span><span>int</span><span><span> </span><span>x2</span><span> </span></span><span><span>=</span><span> re[left][</span></span><span>2</span><span>];</span></div></div><div><div><div>49</div></div><div><span>        </span><span>int</span><span><span> </span><span>y2</span><span> </span></span><span><span>=</span><span> re[left][</span></span><span>3</span><span>];</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>        </span><span>int</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> </span></span><span>rand</span><span>.</span><span>nextInt</span><span><span>(x2 </span><span>-</span><span> x1 </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>+</span><span> x1;</span></span></div></div><div><div><div>52</div></div><div><span>        </span><span>int</span><span><span> </span><span>y</span><span> </span></span><span><span>=</span><span> </span></span><span>rand</span><span>.</span><span>nextInt</span><span><span>(y2 </span><span>-</span><span> y1 </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>+</span><span> y1;</span></span></div></div><div><div><div>53</div></div><div><span>        </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[]{x, y};</span></div></div><div><div><div>54</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span>}</span></div></div><div><div><div>56</div></div><div>
</div></div><div><div><div>57</div></div><div><span>/**</span></div></div><div><div><div>58</div></div><div><span><span> </span></span><span>* Your Solution object will be instantiated and called as such:</span></div></div><div><div><div>59</div></div><div><span><span> </span></span><span>* Solution obj = new Solution(rects);</span></div></div><div><div><div>60</div></div><div><span><span> </span></span><span>* int[] param_1 = obj.pick();</span></div></div><div><div><div>61</div></div><div><span><span> </span></span><span>*/</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>498. Diagonal Traverse<a href="#498-diagonal-traverse"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/diagonal-traverse/" target="_blank">https://leetcode.com/problems/diagonal-traverse/</a></p><hr /><p>观察奇偶性，发现向上移动时，行与列下标相加总是偶数；向下移动时，总是奇数。运用此规律分类讨论，并注意单独分析边界掉头转向的情况。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>findDiagonalOrder</span><span>(</span><span>int</span><span><span>[][] </span><span>matrix</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>matrix</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[</span><span>0</span><span>];</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>r</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, c </span><span>=</span><span> </span></span><span>0</span><span><span>, m </span><span>=</span><span> </span></span><span>matrix</span><span>.</span><span>length</span><span><span>, n </span><span>=</span><span> matrix[</span></span><span>0</span><span>].</span><span>length</span><span><span>, result[] </span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[m </span><span>*</span><span> n];</span></span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>result</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>result[i] </span><span>=</span><span> matrix[r][c];</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span><span> ((r </span><span>+</span><span> c) </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>                </span><span>if</span><span><span> (c </span><span>==</span><span> n </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>13</div></div><div><span>                    </span><span>// move to next row, go downward</span></div></div><div><div><div>14</div></div><div><span><span>                    </span></span><span>r++;</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (r </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>                    </span><span>// move to next column, go downward</span></div></div><div><div><div>17</div></div><div><span><span>                    </span></span><span>c++;</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>19</div></div><div><span><span>                    </span></span><span>r--;</span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>c++;</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>23</div></div><div><span>                </span><span>if</span><span><span> (r </span><span>==</span><span> m </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>                    </span><span>// move to next column, go upward</span></div></div><div><div><div>25</div></div><div><span><span>                    </span></span><span>c++;</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>                    </span><span>// move to next row, go upward</span></div></div><div><div><div>28</div></div><div><span><span>                    </span></span><span>r++;</span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>30</div></div><div><span><span>                    </span></span><span>r++;</span></div></div><div><div><div>31</div></div><div><span><span>                    </span></span><span>c--;</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>499. The Maze III<a href="#499-the-maze-iii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/the-maze-iii/" target="_blank">https://leetcode.com/problems/the-maze-iii/</a></p><hr /><p>从起始点开始，遍历4个可能的方向，对任何一个方向，尝试在这个方向上一条路走到黑，如果撞墙了就尝试左右转向。不断递归尝试，看最后是否有情况下能到达<code>hole</code>。维护两个变量<code>minS</code>和<code>min</code>，分别表示已走过的最短成功路径字符串和最短成功路径的长度，再对应维护两个变量表示当前路径的详情和长度，每走一步就更新当前变量，如果到达<code>hole</code>看是否能更新最小值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> min</span><span><span>;</span><span> </span></span><span>// min distance to hole</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>String</span><span> minS</span><span><span>;</span><span> </span></span><span>// min distance's path string</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] hole</span><span>;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[][] maze</span><span>;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[][] map</span><span><span>;</span><span> </span></span><span>// shortest distant traveling from ball to this point</span></div></div><div><div><div>7</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[][] dirs </span><span><span>=</span><span> { {</span></span><span>0</span><span><span>,</span><span> </span></span><span>1</span><span><span>}</span><span>,</span><span> {</span><span>-</span></span><span>1</span><span><span>,</span><span> </span></span><span>0</span><span><span>}</span><span>,</span><span> {</span></span><span>1</span><span><span>,</span><span> </span></span><span>0</span><span><span>}</span><span>,</span><span> {</span></span><span>0</span><span><span>,</span><span> </span><span>-</span></span><span>1</span><span><span>} }</span><span>;</span><span> </span></span><span>// right, up, down, left</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>findShortestWay</span><span>(</span><span>int</span><span><span>[][] </span><span>maze</span><span>, </span></span><span>int</span><span><span>[] </span><span>ball</span><span>, </span></span><span>int</span><span><span>[] </span><span>hole</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>this</span><span>.</span><span>min</span><span><span> </span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>11</div></div><div><span>        </span><span>this</span><span>.</span><span>minS</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>this</span><span>.</span><span>hole</span><span><span> </span><span>=</span><span> hole;</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>this</span><span>.</span><span>maze</span><span><span> </span><span>=</span><span> maze;</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>this</span><span>.</span><span>map</span><span><span> </span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>maze</span><span>.</span><span>length</span><span>][maze[</span><span>0</span><span>].</span><span>length</span><span>];</span></div></div><div><div><div>15</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>map</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>Arrays</span><span>.</span><span>fill</span><span>(map[i], </span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>);</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>move</span><span>(ball[</span><span>0</span><span>], ball[</span><span>1</span><span>], </span><span>0</span><span>, </span><span>""</span><span><span>, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span><span> minS </span><span>==</span><span> </span></span><span>null</span><span> </span><span>?</span><span> </span><span>"impossible"</span><span> </span><span>:</span><span> minS;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>move</span><span>(</span><span>int</span><span><span> </span><span>r</span><span>, </span></span><span>int</span><span><span> </span><span>c</span><span>, </span></span><span>int</span><span><span> </span><span>cnt</span><span>, </span></span><span>String</span><span><span> </span><span>path</span><span>, </span></span><span>int</span><span><span> </span><span>dir</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>// current path's length is not shortest</span></div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span><span> (cnt </span><span>&gt;</span><span> min </span><span>||</span><span> cnt </span><span>&gt;</span><span> map[r][c]) {</span></span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// exclude start point</span></div></div><div><div><div>30</div></div><div><span>        </span><span>if</span><span><span> (dir </span><span>!=</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>31</div></div><div><span>            </span><span>// add current diretions to path</span></div></div><div><div><div>32</div></div><div><span>            </span><span>if</span><span><span> (dir </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>path </span><span>+=</span><span> </span><span>'r'</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (dir </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>path </span><span>+=</span><span> </span><span>'u'</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (dir </span><span>==</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>37</div></div><div><span><span>                </span></span><span>path </span><span>+=</span><span> </span><span>'d'</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>39</div></div><div><span><span>                </span></span><span>path </span><span>+=</span><span> </span><span>'l'</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>            </span><span>while</span><span><span> (r </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> r </span><span>&lt;</span><span> </span></span><span>maze</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> c </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> c </span><span>&lt;</span><span> maze[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> maze[r][c] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>43</div></div><div><span><span>                </span></span><span>map[r][c] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(map[r][c], cnt);</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span>                </span><span>// reach the hole</span></div></div><div><div><div>46</div></div><div><span>                </span><span>if</span><span><span> (r </span><span>==</span><span> hole[</span></span><span>0</span><span><span>] </span><span>&amp;&amp;</span><span> c </span><span>==</span><span> hole[</span></span><span>1</span><span>]) {</span></div></div><div><div><div>47</div></div><div><span>                    </span><span>// lexicographically smallest way</span></div></div><div><div><div>48</div></div><div><span>                    </span><span>if</span><span><span> (cnt </span><span>==</span><span> min </span><span>&amp;&amp;</span><span> </span></span><span>path</span><span>.</span><span>compareTo</span><span><span>(minS) </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>49</div></div><div><span><span>                        </span></span><span>minS </span><span>=</span><span> path;</span></div></div><div><div><div>50</div></div><div><span><span>                    </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (cnt </span><span>&lt;</span><span> min) {</span></span></div></div><div><div><div>51</div></div><div><span><span>                        </span></span><span>min </span><span>=</span><span> cnt;</span></div></div><div><div><div>52</div></div><div><span><span>                        </span></span><span>minS </span><span>=</span><span> path;</span></div></div><div><div><div>53</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span>                    </span><span>return</span><span>;</span></div></div><div><div><div>55</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>56</div></div><div>
</div></div><div><div><div>57</div></div><div><span>                </span><span>// roll along direction</span></div></div><div><div><div>58</div></div><div><span><span>                </span></span><span>r </span><span>+=</span><span> dirs[dir][</span><span>0</span><span>];</span></div></div><div><div><div>59</div></div><div><span><span>                </span></span><span>c </span><span>+=</span><span> dirs[dir][</span><span>1</span><span>];</span></div></div><div><div><div>60</div></div><div><span><span>                </span></span><span>cnt++;</span></div></div><div><div><div>61</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>62</div></div><div>
</div></div><div><div><div>63</div></div><div><span>            </span><span>// [r, c] is wall, need to walk back 1 step</span></div></div><div><div><div>64</div></div><div><span><span>            </span></span><span>r </span><span>-=</span><span> dirs[dir][</span><span>0</span><span>];</span></div></div><div><div><div>65</div></div><div><span><span>            </span></span><span>c </span><span>-=</span><span> dirs[dir][</span><span>1</span><span>];</span></div></div><div><div><div>66</div></div><div><span><span>            </span></span><span>cnt--;</span></div></div><div><div><div>67</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>68</div></div><div>
</div></div><div><div><div>69</div></div><div><span>        </span><span>// hit wall (or start) -&gt; try to turn</span></div></div><div><div><div>70</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>dirs</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>71</div></div><div><span>            </span><span>// don't keep going or go back</span></div></div><div><div><div>72</div></div><div><span>            </span><span>if</span><span><span> (dir </span><span>==</span><span> i </span><span>||</span><span> dir </span><span>==</span><span> </span></span><span>3</span><span><span> </span><span>-</span><span> i) {</span></span></div></div><div><div><div>73</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>74</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>75</div></div><div>
</div></div><div><div><div>76</div></div><div><span>            </span><span>int</span><span><span> </span><span>newR</span><span> </span></span><span><span>=</span><span> r </span><span>+</span><span> dirs[i][</span></span><span>0</span><span>];</span></div></div><div><div><div>77</div></div><div><span>            </span><span>int</span><span><span> </span><span>newC</span><span> </span></span><span><span>=</span><span> c </span><span>+</span><span> dirs[i][</span></span><span>1</span><span>];</span></div></div><div><div><div>78</div></div><div>
</div></div><div><div><div>79</div></div><div><span>            </span><span>// new space is still valid</span></div></div><div><div><div>80</div></div><div><span>            </span><span>if</span><span><span> (newR </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> newR </span><span>&lt;</span><span> </span></span><span>maze</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> newC </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> newC </span><span>&lt;</span><span> maze[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> maze[newR][newC] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>81</div></div><div><span>                </span><span>move</span><span>(r, c, cnt, path, i);</span></div></div><div><div><div>82</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>83</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>84</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>85</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>500. Keyboard Row<a href="#500-keyboard-row"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/keyboard-row/" target="_blank">https://leetcode.com/problems/keyboard-row/</a></p><hr /><p>统计每个单词中的字母分别在每行出现了几次，如果只在一行出现，就把它添加到结果中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span>[] </span><span>findWords</span><span>(</span><span>String</span><span><span>[] </span><span>words</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>strs</span><span> </span></span><span><span>=</span><span> {</span></span><span>"qwertyuiop"</span><span>,</span><span>"asdfghjkl"</span><span>,</span><span>"zxcvbnm"</span><span>};</span></div></div><div><div><div>4</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>results</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>();</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>word</span><span> </span></span><span>:</span><span> words) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>int</span><span><span> </span><span>count1</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, count2 </span><span>=</span><span> </span></span><span>0</span><span><span>, count3 </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>            </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>word</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>10</div></div><div><span>                </span><span>if</span><span> (strs[</span><span>0</span><span>].</span><span>indexOf</span><span><span>(c) </span><span>!=</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>11</div></div><div><span><span>                    </span></span><span>count1++;</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>                </span><span>if</span><span> (strs[</span><span>1</span><span>].</span><span>indexOf</span><span><span>(c) </span><span>!=</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>14</div></div><div><span><span>                    </span></span><span>count2++;</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>                </span><span>if</span><span> (strs[</span><span>2</span><span>].</span><span>indexOf</span><span><span>(c) </span><span>!=</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>17</div></div><div><span><span>                    </span></span><span>count3++;</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>// only comes from one row</span></div></div><div><div><div>22</div></div><div><span>            </span><span>if</span><span><span> ((count1 </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> count2 </span><span>==</span><span> </span></span><span>0</span><span><span>) </span><span>||</span><span> (count1 </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> count3 </span><span>==</span><span> </span></span><span>0</span><span><span>) </span><span>||</span><span> (count2 </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> count3 </span><span>==</span><span> </span></span><span>0</span><span>)) {</span></div></div><div><div><div>23</div></div><div><span>                </span><span>results</span><span>.</span><span>add</span><span>(word);</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> </span><span>results</span><span>.</span><span>toArray</span><span>(</span><span>new</span><span> </span><span>String</span><span>[</span><span>results</span><span>.</span><span>size</span><span>()]);</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://mikeyan01.github.io/posts/2020-01-01-leetcode501-600/</id>
      <title type="text">LeetCode 501-600</title>
      <published>2020-01-01T00:00:00.000Z</published>
      <updated>2020-01-01T00:00:00.000Z</updated>
      <author><name>MikeYan01</name></author>
      <link rel="alternate" href="https://mikeyan01.github.io/posts/2020-01-01-leetcode501-600/"/>
      <summary type="text">LeetCode Problems 501-600.</summary>
      <content type="html"><![CDATA[<p>LeetCode Problems 501-600.</p>

<section><h2>501. Find Mode in Binary Search Tree<a href="#501-find-mode-in-binary-search-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-mode-in-binary-search-tree/" target="_blank">https://leetcode.com/problems/find-mode-in-binary-search-tree/</a></p><hr /><p>使用一个数组存储全部的<code>mode</code>，然后使用中序遍历，统计当前遍历的数出现的次数，并判断是否需要更新到<code>mode</code>数组中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> currVal</span><span>;</span></div></div><div><div><div>18</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> currCount </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>19</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> maxCount </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> modeCount </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>21</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] modes</span><span>;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>findMode</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>inorder</span><span>(root);</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>modes </span><span>=</span><span> </span><span>new</span><span> </span><span>int</span><span>[modeCount];</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>modeCount </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>currCount </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>28</div></div><div><span>        </span><span>inorder</span><span>(root);</span></div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> modes;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>inorder</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>33</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>34</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>        </span><span>inorder</span><span>(</span><span>root</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>// update current number's count</span></div></div><div><div><div>39</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>val</span><span><span> </span><span>!=</span><span> currVal) {</span></span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>currVal </span><span>=</span><span> </span><span>root</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>currCount </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span><span>        </span></span><span>currCount++;</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span>        </span><span>if</span><span><span> (currCount </span><span>&gt;</span><span> maxCount) {</span></span></div></div><div><div><div>46</div></div><div><span>            </span><span>// if current number is new mode, update</span></div></div><div><div><div>47</div></div><div><span><span>            </span></span><span>maxCount </span><span>=</span><span> currCount;</span></div></div><div><div><div>48</div></div><div><span><span>            </span></span><span>modeCount </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>49</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (currCount </span><span>==</span><span> maxCount) {</span></span></div></div><div><div><div>50</div></div><div><span>            </span><span>// current number one of the modes</span></div></div><div><div><div>51</div></div><div><span>            </span><span>if</span><span><span> (modes </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>52</div></div><div><span><span>                </span></span><span>modes[modeCount] </span><span>=</span><span> currVal;</span></div></div><div><div><div>53</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span><span>            </span></span><span>modeCount++;</span></div></div><div><div><div>55</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>56</div></div><div>
</div></div><div><div><div>57</div></div><div><span>        </span><span>inorder</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>58</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>59</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>502. IPO<a href="#502-ipo"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/ipo/" target="_blank">https://leetcode.com/problems/ipo/</a></p><hr /><p>如果<code>Capital</code>中每个数都小于<code>w</code>，说明本金足够多，可以任选<code>k</code>个项目，直接选利润最高的<code>k</code>个即可；否则，需要从成本低的项目选起，找出既满足成本，又是当前最高利润的项目。每做完一个项目，利润 + 原始的本金就变成了新的本金，可以做更多的项目，于是再次去尝试找到成本符合要求的项目，并且利润尽量高…</p><p>因为最多可以做<code>k</code>个项目，我们的代码至多为<code>k</code>次循环，每次循环内都重复以上流程；而如果剩下的项目全部高于已有本金，循环就提前终止。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findMaximizedCapital</span><span>(</span><span>int</span><span><span> </span><span>k</span><span>, </span></span><span>int</span><span><span> </span><span>w</span><span>, </span></span><span>int</span><span><span>[] </span><span>Profits</span><span>, </span></span><span>int</span><span><span>[] </span><span>Capital</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// true if all capitals &lt;= initial capital</span></div></div><div><div><div>4</div></div><div><span>        </span><span>boolean</span><span><span> </span><span>speedUp</span><span> </span></span><span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>c</span></span><span>:</span><span> Capital) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span><span> (w </span><span>&lt;</span><span> c) {</span></span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>speedUp </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// add k largest profits</span></div></div><div><div><div>13</div></div><div><span>        </span><span>if</span><span> (speedUp) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>PriorityQueue</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>heap</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;&gt;();</span></div></div><div><div><div>15</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>p</span></span><span>:</span><span> Profits) {</span></div></div><div><div><div>16</div></div><div><span>                </span><span>heap</span><span>.</span><span>add</span><span>(p);</span></div></div><div><div><div>17</div></div><div><span>                </span><span>if</span><span> (</span><span>heap</span><span>.</span><span>size</span><span><span>() </span><span>&gt;</span><span> k) {</span></span></div></div><div><div><div>18</div></div><div><span>                    </span><span>heap</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>h</span></span><span>:</span><span> heap) {</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>w </span><span>+=</span><span> h;</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>            </span><span>return</span><span> w;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>Profits</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>28</div></div><div><span>        </span><span>PriorityQueue</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>minCapitalHeap</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;&gt;((a, b) </span><span>-&gt;</span><span> </span><span>Capital</span><span><span>[a] </span><span>-</span><span> </span></span><span>Capital</span><span>[b]);</span></div></div><div><div><div>29</div></div><div><span>        </span><span>PriorityQueue</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>maxProfitHeap</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>PriorityQueue</span><span>&lt;&gt;((a, b) </span><span>-&gt;</span><span> </span><span>Profits</span><span><span>[b] </span><span>-</span><span> </span></span><span>Profits</span><span>[a]);</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>// sort all projects by capital in ascending order</span></div></div><div><div><div>32</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>33</div></div><div><span>            </span><span>minCapitalHeap</span><span>.</span><span>offer</span><span>(i);</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>// we can finish at most k projects</span></div></div><div><div><div>37</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> k; i++) {</span></span></div></div><div><div><div>38</div></div><div><span>            </span><span>// find projects that can be selected with the available capital</span></div></div><div><div><div>39</div></div><div><span>            </span><span>while</span><span><span> (</span><span>!</span></span><span>minCapitalHeap</span><span>.</span><span>isEmpty</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>Capital</span><span>[</span><span>minCapitalHeap</span><span>.</span><span>peek</span><span><span>()] </span><span>&lt;=</span><span> w) {</span></span></div></div><div><div><div>40</div></div><div><span>                </span><span>maxProfitHeap</span><span>.</span><span>add</span><span>(</span><span>minCapitalHeap</span><span>.</span><span>poll</span><span>());</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>            </span><span>// terminate if we are not able to find any available capital</span></div></div><div><div><div>44</div></div><div><span>            </span><span>if</span><span> (</span><span>maxProfitHeap</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>45</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>46</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span>            </span><span>// add first project's profit</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>w </span><span>+=</span><span> </span><span>Profits</span><span>[</span><span>maxProfitHeap</span><span>.</span><span>poll</span><span>()];</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>        </span><span>return</span><span> w;</span></div></div><div><div><div>53</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>503. Next Greater Element II<a href="#503-next-greater-element-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/next-greater-element-ii/" target="_blank">https://leetcode.com/problems/next-greater-element-ii/</a></p><hr /><p>两次循环，并用一个栈存储遍历时涉及的元素下标。</p><p>第一次循环，遍历一个数时检查栈，如果栈不空并且栈顶下标对应的数比遍历数小，说明当前的遍历数就是栈顶对应数的next greater element。之后，把当前遍历数下标存入栈中。</p><p>第二次循环，再次从头开始遍历数组，然而第一次循环后的栈并未被清空，相当于新遍历的下标在与此前循环的遍历结果进行比较，以这种方式模拟循环数组。具体比较策略与第一次循环相同。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>nextGreaterElements</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>nums</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>stack</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;&gt;();</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// first loop, get the index of next greater element in normal array</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>while</span><span><span> (</span><span>!</span></span><span>stack</span><span>.</span><span>isEmpty</span><span><span>() </span><span>&amp;&amp;</span><span> nums[</span></span><span>stack</span><span>.</span><span>peek</span><span><span>()] </span><span>&lt;</span><span> nums[i]) {</span></span></div></div><div><div><div>9</div></div><div><span>                </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>stack</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>result[index] </span><span>=</span><span> nums[i];</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>stack</span><span>.</span><span>push</span><span>(i);</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// second loop, get the index of next greater element in circular array</span></div></div><div><div><div>17</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>while</span><span><span> (</span><span>!</span></span><span>stack</span><span>.</span><span>isEmpty</span><span><span>() </span><span>&amp;&amp;</span><span> nums[</span></span><span>stack</span><span>.</span><span>peek</span><span><span>()] </span><span>&lt;</span><span> nums[i]) {</span></span></div></div><div><div><div>19</div></div><div><span>                </span><span>int</span><span><span> </span><span>index</span><span> </span></span><span><span>=</span><span> </span></span><span>stack</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>result[index] </span><span>=</span><span> nums[i];</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// cannot find greater element</span></div></div><div><div><div>25</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>stack</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>result[</span><span>stack</span><span>.</span><span>pop</span><span><span>()] </span><span>=</span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>504. Base 7<a href="#504-base-7"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/base-7/" target="_blank">https://leetcode.com/problems/base-7/</a></p><hr /><p>不断提取每一位的模，最后再头尾颠倒生成字符串。注意对于0，直接返回。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>convertToBase7</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (num </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>"0"</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span>(num);</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>while</span><span><span> (n </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span><span>(n </span><span>%</span><span> </span></span><span>7</span><span>);</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>n </span><span>/=</span><span> </span><span>7</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>if</span><span><span> (num </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>"-"</span><span>);</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>reverse</span><span>().</span><span>toString</span><span>();</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>505. The Maze II<a href="#505-the-maze-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/the-maze-ii/" target="_blank">https://leetcode.com/problems/the-maze-ii/</a></p><hr /><p>使用一个二维数组<code>distance</code>存储起点到每个点的最短距离（初始距离都是-1，即假设为不可达）。之后使用BFS，遍历每个方向并且在每个方向一直走直到撞上障碍，如果走到一个未访问过的方格中，或者当前的路径比之前的路径更短，就把当前方格加入到队列中，并更新当前方格最短距离。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>shortestDistance</span><span>(</span><span>int</span><span><span>[][] </span><span>maze</span><span>, </span></span><span>int</span><span><span>[] </span><span>start</span><span>, </span></span><span>int</span><span><span>[] </span><span>destination</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// directions to top, bottom, left and right</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dirs</span><span> </span></span><span><span>=</span><span> { {</span><span>-</span></span><span>1</span><span>, </span><span>0</span><span>}, {</span><span>1</span><span>, </span><span>0</span><span>}, {</span><span>0</span><span><span>, </span><span>-</span></span><span>1</span><span>}, {</span><span>0</span><span>, </span><span>1</span><span>} };</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// store shotest distance</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>distance</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>maze</span><span>.</span><span>length</span><span>][maze[</span><span>0</span><span>].</span><span>length</span><span>];</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// Set all cell as -1 initially</span></div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>d</span><span> </span></span><span>:</span><span> distance) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>Arrays</span><span>.</span><span>fill</span><span><span>(d, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>distance[start[</span><span>0</span><span>]][start[</span><span>1</span><span><span>]] </span><span>=</span><span> </span></span><span>0</span><span>; </span><span>// start distance</span></div></div><div><div><div>15</div></div><div><span>        </span><span>Queue</span><span>&lt;</span><span>int</span><span><span>[]&gt; </span><span>q</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayDeque</span><span>&lt;&gt;();</span></div></div><div><div><div>16</div></div><div><span>        </span><span>q</span><span>.</span><span>add</span><span>(start);</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>q</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>int</span><span><span>[] </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>q</span><span>.</span><span>poll</span><span>();</span></div></div><div><div><div>20</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>dir</span><span> </span></span><span>:</span><span> dirs) {</span></div></div><div><div><div>21</div></div><div><span>                </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> distance[c[</span></span><span>0</span><span>]][c[</span><span>1</span><span>]];</span></div></div><div><div><div>22</div></div><div><span>                </span><span>int</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> c[</span></span><span>0</span><span>];</span></div></div><div><div><div>23</div></div><div><span>                </span><span>int</span><span><span> </span><span>y</span><span> </span></span><span><span>=</span><span> c[</span></span><span>1</span><span>];</span></div></div><div><div><div>24</div></div><div><span>                </span><span>while</span><span><span> (x </span><span>+</span><span> dir[</span></span><span>0</span><span><span>] </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> x </span><span>+</span><span> dir[</span></span><span>0</span><span><span>] </span><span>&lt;</span><span> </span></span><span>maze</span><span>.</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> y </span><span>+</span><span> dir[</span></span><span>1</span><span><span>] </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> y </span><span>+</span><span> dir[</span></span><span>1</span><span><span>] </span><span>&lt;</span><span> maze[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>&amp;&amp;</span><span> maze[x </span><span>+</span><span> dir[</span></span><span>0</span><span><span>]][y </span><span>+</span><span> dir[</span></span><span>1</span><span><span>]] </span><span>!=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>25</div></div><div><span><span>                    </span></span><span>x </span><span>+=</span><span> dir[</span><span>0</span><span>];</span></div></div><div><div><div>26</div></div><div><span><span>                    </span></span><span>y </span><span>+=</span><span> dir[</span><span>1</span><span>];</span></div></div><div><div><div>27</div></div><div><span><span>                    </span></span><span>count++;</span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>                </span><span>// unvisited cell, or a shorter path, add it to queue and update distance</span></div></div><div><div><div>31</div></div><div><span>                </span><span>if</span><span><span> (distance[x][y] </span><span>==</span><span> </span><span>-</span></span><span>1</span><span><span> </span><span>||</span><span> distance[x][y] </span><span>&gt;</span><span> count) {</span></span></div></div><div><div><div>32</div></div><div><span>                    </span><span>q</span><span>.</span><span>add</span><span>(</span><span>new</span><span> </span><span>int</span><span>[]{x, y});</span></div></div><div><div><div>33</div></div><div><span><span>                    </span></span><span>distance[x][y] </span><span>=</span><span> count;</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> distance[destination[</span><span>0</span><span>]][destination[</span><span>1</span><span>]];</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>506. Relative Ranks<a href="#506-relative-ranks"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/relative-ranks/" target="_blank">https://leetcode.com/problems/relative-ranks/</a></p><hr /><p>找出数组的最大值和最小值，以此安排桶容纳所有元素并进行排序，每个元素因为是唯一的，所以排序上每个元素也不存在并列的情况。完成桶排序之后，从大桶开始向下遍历，分配排名座次。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span>[] </span><span>findRelativeRanks</span><span>(</span><span>int</span><span><span>[] </span><span>score</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (score </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>score</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>score</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>String</span><span>[n];</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// find min and max values to set buckets</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>max</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, min </span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> score) {</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>max </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(max, num);</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>min </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(min, num);</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// each value is mapped to a unique index</span></div></div><div><div><div>17</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>valToIndex</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[max </span><span>-</span><span> min </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>18</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>fill</span><span><span>(valToIndex, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>19</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>valToIndex[score[i] </span><span>-</span><span> min] </span><span>=</span><span> i;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>// start from highest scores to assign rank</span></div></div><div><div><div>24</div></div><div><span>        </span><span>int</span><span><span> </span><span>rank</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>25</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>val</span><span> </span></span><span><span>=</span><span> max </span><span>-</span><span> min; val </span><span>&gt;=</span><span> </span></span><span>0</span><span>; val--) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>if</span><span><span> (valToIndex[val] </span><span>==</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>if</span><span><span> (rank </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>result[valToIndex[val]] </span><span>=</span><span> </span><span>"Gold Medal"</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (rank </span><span>==</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>result[valToIndex[val]] </span><span>=</span><span> </span><span>"Silver Medal"</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (rank </span><span>==</span><span> </span></span><span>3</span><span>) {</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>result[valToIndex[val]] </span><span>=</span><span> </span><span>"Bronze Medal"</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>37</div></div><div><span><span>                </span></span><span>result[valToIndex[val]] </span><span>=</span><span> </span><span>String</span><span>.</span><span>valueOf</span><span>(rank);</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>rank++;</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>507. Perfect Number<a href="#507-perfect-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/perfect-number/" target="_blank">https://leetcode.com/problems/perfect-number/</a></p><hr /><p>从2到<code>sqrt(num)</code>，穷举累加所有质因数组合，看总和 + 1是否与<code>num</code>一致。需要注意排除1和所有非正数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>checkPerfectNumber</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (num </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>sumOfDivisors</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>2</span><span><span>; i </span><span>&lt;=</span><span> (</span></span><span>int</span><span>)</span><span>Math</span><span>.</span><span>sqrt</span><span>(num); i++) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span><span> (num </span><span>%</span><span> i </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>sumOfDivisors </span><span>+=</span><span> (i </span><span>+</span><span> num </span><span>/</span><span> i);</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span><span> sumOfDivisors </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>==</span><span> num;</span></span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>508. Most Frequent Subtree Sum<a href="#508-most-frequent-subtree-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/most-frequent-subtree-sum/" target="_blank">https://leetcode.com/problems/most-frequent-subtree-sum/</a></p><hr /><p>DFS遍历，每个子树的和是左子树的和 + 右子树的和 + 根节点的值。使用一个map统计当前每个子树和的值以及对应的出现次数，每计算出一个子树和就更新一次map。同时维护一个储存最高频子树和的list，如果当前的值是出现频率最高的，就一并更新list。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> list</span></span><span>;</span></div></div><div><div><div>18</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> maxFreq </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span>// &lt;sum, freq&gt;</span></div></div><div><div><div>21</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>Integer</span><span><span>,</span><span> </span></span><span>Integer</span><span><span>&gt;</span><span> map</span></span><span>;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>findFrequentTreeSum</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[]{};</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>map </span><span>=</span><span> </span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>list </span><span>=</span><span> </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>DFS</span><span>(root);</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>list</span><span>.</span><span>size</span><span>()];</span></div></div><div><div><div>34</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>35</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>ele</span></span><span>:</span><span> list) {</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>result[i] </span><span>=</span><span> ele;</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>i++;</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>DFS</span><span>(</span><span>TreeNode</span><span><span> </span><span>cur</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>43</div></div><div><span>        </span><span>// current subtree's sum</span></div></div><div><div><div>44</div></div><div><span>        </span><span>if</span><span><span> (cur </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>45</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span>        </span><span>int</span><span><span> </span><span>leftSum</span><span> </span></span><span><span>=</span><span> </span></span><span>DFS</span><span>(</span><span>cur</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>48</div></div><div><span>        </span><span>int</span><span><span> </span><span>rightSum</span><span> </span></span><span><span>=</span><span> </span></span><span>DFS</span><span>(</span><span>cur</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>49</div></div><div><span>        </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> leftSum </span><span>+</span><span> rightSum </span><span>+</span><span> </span></span><span>cur</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>        </span><span>int</span><span><span> </span><span>curFreq</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>getOrDefault</span><span>(sum, </span><span>0</span><span><span>) </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>52</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(sum, curFreq);</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span>        </span><span>// empty list and add the new largest sum</span></div></div><div><div><div>55</div></div><div><span>        </span><span>if</span><span><span> (curFreq </span><span>&gt;</span><span> maxFreq) {</span></span></div></div><div><div><div>56</div></div><div><span><span>            </span></span><span>maxFreq </span><span>=</span><span> curFreq;</span></div></div><div><div><div>57</div></div><div><span>            </span><span>list</span><span>.</span><span>clear</span><span>();</span></div></div><div><div><div>58</div></div><div><span>            </span><span>list</span><span>.</span><span>add</span><span>(sum);</span></div></div><div><div><div>59</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (curFreq </span><span>==</span><span> maxFreq) {</span></span></div></div><div><div><div>60</div></div><div><span>            </span><span>list</span><span>.</span><span>add</span><span>(sum);</span></div></div><div><div><div>61</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>62</div></div><div>
</div></div><div><div><div>63</div></div><div><span>        </span><span>return</span><span> sum;</span></div></div><div><div><div>64</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>65</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>509. Fibonacci Number<a href="#509-fibonacci-number"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/fibonacci-number/" target="_blank">https://leetcode.com/problems/fibonacci-number/</a></p><hr /><p>循环累加即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>fib</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> (n </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// current index of Fibonacci sequence</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>current</span><span> </span></span><span><span>=</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// current Fibonacci number</span></div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span> </span><span>num</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// preceding two numbers</span></div></div><div><div><div>17</div></div><div><span>        </span><span>int</span><span><span> </span><span>preceding2</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span> </span><span>preceding1</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>while</span><span><span> (current </span><span>&lt;=</span><span> n) {</span></span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>num </span><span>=</span><span> preceding2 </span><span>+</span><span> preceding1;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>            </span><span>// update preceding numbers</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>preceding2 </span><span>=</span><span> preceding1;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>preceding1 </span><span>=</span><span> num;</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>current++;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> num;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>510. Inorder Successor in BST II<a href="#510-inorder-successor-in-bst-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/inorder-successor-in-bst-ii/" target="_blank">https://leetcode.com/problems/inorder-successor-in-bst-ii/</a></p><hr /><p>如果<code>x</code>没有右儿子，就向上寻找到比<code>x</code>大的最小祖先；反之，向下寻找到右子树中的最小节点。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public Node left;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>public Node right;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node parent;</span></div></div><div><div><div>8</div></div><div><span>};</span></div></div><div><div><div>9</div></div><div><span>*/</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>Node</span><span> </span><span>inorderSuccessor</span><span>(</span><span>Node</span><span><span> </span><span>x</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>// no right child, find the smallest ancestor which is larger than x</span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span> (</span><span>x</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>Node</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> x;</span></span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>// search upwards in the right subtree</span></div></div><div><div><div>18</div></div><div><span>            </span><span>while</span><span> (</span><span>cur</span><span>.</span><span>parent</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>cur</span><span>.</span><span>parent</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> cur) {</span></span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>parent</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> </span><span>cur</span><span>.</span><span>parent</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// have right child, find the leftmost element in the right subtree</span></div></div><div><div><div>25</div></div><div><span>        </span><span>Node</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>x</span><span>.</span><span>right</span><span>;</span></div></div><div><div><div>26</div></div><div><span>        </span><span>while</span><span> (</span><span>cur</span><span>.</span><span>left</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>left</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> cur;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>511. Game Play Analysis I<a href="#511-game-play-analysis-i"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/game-play-analysis-i/" target="_blank">https://leetcode.com/problems/game-play-analysis-i/</a></p><hr /><p>做一次group by即可。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> player_id, </span><span>MIN</span><span>(event_date) </span><span>AS</span><span> first_login</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Activity</span></div></div><div><div><div>3</div></div><div><span>GROUP BY</span><span> player_id;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>512. Game Play Analysis II<a href="#512-game-play-analysis-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/game-play-analysis-ii/" target="_blank">https://leetcode.com/problems/game-play-analysis-ii/</a></p><hr /><p>先找到首次登陆的记录行，再从中提取出<code>player_id</code>与<code>device_id</code>。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> player_id, device_id</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> activity</span></div></div><div><div><div>3</div></div><div><span>WHERE</span><span> (player_id, event_date) </span><span>IN</span><span> (</span></div></div><div><div><div>4</div></div><div><span>    </span><span>SELECT</span><span> player_id, </span><span>MIN</span><span>(event_date)</span></div></div><div><div><div>5</div></div><div><span>    </span><span>FROM</span><span> activity</span></div></div><div><div><div>6</div></div><div><span>    </span><span>GROUP BY</span><span> player_id</span></div></div><div><div><div>7</div></div><div><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>513. Find Bottom Left Tree Value<a href="#513-find-bottom-left-tree-value"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-bottom-left-tree-value/" target="_blank">https://leetcode.com/problems/find-bottom-left-tree-value/</a></p><hr /><p>使用中序遍历，保证先访问当前节点的左子树，每访问一个节点，节点深度就增加1，如果当前节点深度最大就更新结果。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> result </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>18</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> maxLevel </span><span><span>=</span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findBottomLeftValue</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>21</div></div><div><span>        </span><span>findLevel</span><span>(root, </span><span>0</span><span>);</span></div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>    </span><span>// in-order will always visit the leftmost value first</span></div></div><div><div><div>26</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>findLevel</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>, </span></span><span>int</span><span><span> </span><span>level</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>28</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>findLevel</span><span>(</span><span>root</span><span>.</span><span>left</span><span><span>, level </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>// update current max level</span></div></div><div><div><div>34</div></div><div><span>        </span><span>if</span><span><span> (level </span><span>&gt;</span><span> maxLevel) {</span></span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>maxLevel </span><span>=</span><span> level;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>root</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>findLevel</span><span>(</span><span>root</span><span>.</span><span>right</span><span><span>, level </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>514. Freedom Trail<a href="#514-freedom-trail"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/freedom-trail/" target="_blank">https://leetcode.com/problems/freedom-trail/</a></p><hr /><p>使用DFS + dp。先遍历<code>ring</code>，把每个字符和对应的下标储存起来。之后使用二维<code>dp</code>，<code>dp[rIdx][kIdx]</code>表示从<code>ring[rIdx]</code>下标开始转，完成<code>key[kIdx]</code>以及之后的字符需要多少步。每一次转动时，都要比较是顺时针转还是逆时针转所需步骤更少，完成当前步之后再用DFS累计后续步骤，得到<code>dp</code>值。注意最后总步骤+1，因为还要按下中央按钮。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findRotateSteps</span><span>(</span><span>String</span><span><span> </span><span>ring</span><span>, </span></span><span>String</span><span><span> </span><span>key</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// &lt;character, character's index in ring&gt;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;[] </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>List</span><span>[</span><span>26</span><span>];</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>ring</span><span>.</span><span>length</span><span>(); i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>char</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>ring</span><span>.</span><span>charAt</span><span>(i);</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (map[c </span><span>-</span><span> </span></span><span>'a'</span><span><span>] </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>map[c </span><span>-</span><span> </span><span>'a'</span><span><span>] </span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>();</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>map[c </span><span>-</span><span> </span><span>'a'</span><span>].</span><span>add</span><span>(i);</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>ring</span><span>.</span><span>length</span><span><span>() </span><span>+</span><span> </span></span><span>1</span><span>][</span><span>key</span><span>.</span><span>length</span><span><span>() </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> </span><span>helper</span><span>(ring, key, </span><span>0</span><span>, </span><span>0</span><span>, map, dp);</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>helper</span><span>(</span><span>String</span><span><span> </span><span>ring</span><span>, </span></span><span>String</span><span><span> </span><span>key</span><span>, </span></span><span>int</span><span><span> </span><span>rIdx</span><span>, </span></span><span>int</span><span><span> </span><span>kIdx</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;[] </span><span>map</span><span>, </span></span><span>int</span><span><span>[][] </span><span>dp</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>// already end of the key, no more characters to press</span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span> (</span><span>key</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> kIdx) {</span></span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// already calculated</span></div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span><span> (dp[rIdx][kIdx] </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span> dp[rIdx][kIdx];</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>int</span><span><span> </span><span>min</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>30</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span>:</span><span> map[</span><span>key</span><span>.</span><span>charAt</span><span><span>(kIdx) </span><span>-</span><span> </span></span><span>'a'</span><span>]) {</span></div></div><div><div><div>31</div></div><div><span>            </span><span>// clockwise vs anticlockwise offset</span></div></div><div><div><div>32</div></div><div><span>            </span><span>int</span><span><span> </span><span>offset</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span>(</span><span>Math</span><span>.</span><span>abs</span><span><span>(rIdx </span><span>-</span><span> i), </span></span><span>ring</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(rIdx </span><span>-</span><span> i));</span></span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>            </span><span>// current offset + all subsequent offsets</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>min </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(min, offset </span><span>+</span><span> </span></span><span>helper</span><span><span>(ring, key, i, kIdx </span><span>+</span><span> </span></span><span>1</span><span>, map, dp));</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>// +1 for pressing the button</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>dp[rIdx][kIdx] </span><span>=</span><span> min </span><span>+</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>        </span><span>return</span><span> dp[rIdx][kIdx];</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>515. Find Largest Value in Each Tree Row<a href="#515-find-largest-value-in-each-tree-row"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-largest-value-in-each-tree-row/" target="_blank">https://leetcode.com/problems/find-largest-value-in-each-tree-row/</a></p><hr /><p>前序遍历，如果访问到新的一层，就把当前的节点加到list中，临时充当本层的最大值；否则，如果是已经访问过的层数，就判断是否需要更新这一层的最大值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>largestValues</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>19</div></div><div><span>        </span><span>largestValues</span><span>(root, result, </span><span>0</span><span>);</span></div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>largestValues</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span>, </span></span><span>int</span><span><span> </span><span>height</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>if</span><span><span> (height </span><span>==</span><span> </span></span><span>result</span><span>.</span><span>size</span><span>()) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>// add value in the new height</span></div></div><div><div><div>30</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>root</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>32</div></div><div><span>            </span><span>// set max of current height</span></div></div><div><div><div>33</div></div><div><span>            </span><span>result</span><span>.</span><span>set</span><span>(height, </span><span>Math</span><span>.</span><span>max</span><span>(</span><span>result</span><span>.</span><span>get</span><span>(height), </span><span>root</span><span>.</span><span>val</span><span>));</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>largestValues</span><span>(</span><span>root</span><span>.</span><span>left</span><span><span>, result, height </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>37</div></div><div><span>        </span><span>largestValues</span><span>(</span><span>root</span><span>.</span><span>right</span><span><span>, result, height </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>516. Longest Palindromic Subsequence<a href="#516-longest-palindromic-subsequence"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-palindromic-subsequence/" target="_blank">https://leetcode.com/problems/longest-palindromic-subsequence/</a></p><hr /><p>先用二维<code>dp</code>，其中<code>dp[i][j]</code>表示<code>s[i, j]</code>中的最长回文串的长度。显然，如果<code>s[i] = s[j]</code>，长度就是<code>dp[i+1][j-1]</code>的基础上 + 2，否则就是<code>dp[i+1][j]</code>与<code>dp[i][j-1]</code>二者取较大值。</p><p>得到二维递推后，可以进一步压缩<code>dp</code>维度，把<code>dp[m][n]</code>压缩成<code>dp[n]</code>，为此可以加入一个变量<code>pre</code>用于辅助保存当前回文串的起始位置。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>longestPalindromeSubseq</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>s</span><span>.</span><span>length</span><span>()];</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// dp[i][j]: the longest palindromic subsequence's length of substring(i, j)</span></div></div><div><div><div>6</div></div><div><span>        </span><span>// dp[i][j] = dp[i+1][j-1] + 2 if s.charAt(i) == s.charAt(j)</span></div></div><div><div><div>7</div></div><div><span>        </span><span>// otherwise, dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1])</span></div></div><div><div><div>8</div></div><div><span>        </span><span>// we can then reduce dp[m][n] to dp[n]</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>dp[i] </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span>            </span><span>int</span><span><span> </span><span>pre</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>12</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> i </span><span>+</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span>(); j++) {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>int</span><span><span> </span><span>tmp</span><span> </span></span><span><span>=</span><span> dp[j];</span></span></div></div><div><div><div>14</div></div><div><span>                </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span>(j)) {</span></div></div><div><div><div>15</div></div><div><span><span>                    </span></span><span>dp[j] </span><span>=</span><span> pre </span><span>+</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>17</div></div><div><span><span>                    </span></span><span>dp[j] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(dp[j], dp[j </span><span>-</span><span> </span></span><span>1</span><span>]);</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>pre </span><span>=</span><span> tmp;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> dp[</span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>517. Super Washing Machines<a href="#517-super-washing-machines"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/super-washing-machines/" target="_blank">https://leetcode.com/problems/super-washing-machines/</a></p><hr /><p>首先通过整除性排除无法均摊衣服的情况。之后通过<code>total / n</code>得到每个洗衣机内的目标衣服数量。因为衣服的均摊需要相邻的洗衣机不断接力传递，因此设定一个<code>toRight</code>变量用于存储不断接力累加后，当前洗衣机需要向右边相邻洗衣机传递的衣服数量（如果为负数，表示从右侧相邻洗衣机接受的衣服数量）。</p><p>很显然，为了平衡衣服数量，即便<code>toRight</code>是0，也需要至少<code>m - target</code>移动；而如果通过<code>toRight</code>累积的数量很大，则需要更多次移动。因此，对每台洗衣机，移动的次数就是这两个变量的最大值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findMinMoves</span><span>(</span><span>int</span><span><span>[] </span><span>machines</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>total</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, n </span><span>=</span><span> </span></span><span>machines</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>m</span><span> </span></span><span>:</span><span> machines) {</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>total </span><span>+=</span><span> m;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// skip impossible cases</span></div></div><div><div><div>9</div></div><div><span>        </span><span>if</span><span><span> (total </span><span>%</span><span> n </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>return</span><span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span> </span><span>target</span><span> </span></span><span><span>=</span><span> total </span><span>/</span><span> n, result </span><span>=</span><span> </span></span><span>0</span><span><span>, toRight </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>m</span><span> </span></span><span>:</span><span> machines) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>// the clothes that we need to pass to the right number</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>toRight </span><span>=</span><span> m </span><span>+</span><span> toRight </span><span>-</span><span> target;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, </span><span>Math</span><span>.</span><span>max</span><span>(</span><span>Math</span><span>.</span><span>abs</span><span><span>(toRight), m </span><span>-</span><span> target));</span></span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>518. Coin Change 2<a href="#518-coin-change-2"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/coin-change-2/" target="_blank">https://leetcode.com/problems/coin-change-2/</a></p><hr /><p>01背包问题，简而言之就是讨论两种情况，要么用当前的硬币，要么不用。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>// dp[i][j] : the number of combinations to make up amount j by using the first i types of coins</span></div></div><div><div><div>3</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>change</span><span>(</span><span>int</span><span><span> </span><span>amount</span><span>, </span></span><span>int</span><span><span>[] </span><span>coins</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>coins</span><span>.</span><span>length</span><span>+</span><span>1</span><span><span>][amount</span><span>+</span></span><span>1</span><span>];</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>dp[</span><span>0</span><span>][</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> </span></span><span>coins</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>dp[i][</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>            </span><span>// dp[i - 1][j]: the number of combinations if we don't use the i-th coin</span></div></div><div><div><div>11</div></div><div><span>            </span><span>// dp[i][j-coins[i-1]]：the number of combinations if we must use at least one of the i-th coin</span></div></div><div><div><div>12</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;=</span><span> amount; j++) {</span></span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>dp[i][j] </span><span>=</span><span> dp[i</span><span>-</span><span>1</span><span><span>][j] </span><span>+</span><span> (j </span><span>&gt;=</span><span> coins[i</span><span>-</span></span><span>1</span><span>] </span><span>?</span><span><span> dp[i][j </span><span>-</span><span> coins[i</span><span>-</span></span><span>1</span><span>]] </span><span>:</span><span> </span><span>0</span><span>);</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span> dp[</span><span>coins</span><span>.</span><span>length</span><span>][amount];</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>//     public int change(int amount, int[] coins) {</span></div></div><div><div><div>21</div></div><div><span>//         int[] dp = new int[amount + 1];</span></div></div><div><div><div>22</div></div><div><span>//         dp[0] = 1;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>//         for (int coin : coins) {</span></div></div><div><div><div>25</div></div><div><span>//             for (int i = coin; i &lt;= amount; i++) {</span></div></div><div><div><div>26</div></div><div><span>//                 dp[i] += dp[i-coin];</span></div></div><div><div><div>27</div></div><div><span>//             }</span></div></div><div><div><div>28</div></div><div><span>//         }</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>//         return dp[amount];</span></div></div><div><div><div>31</div></div><div><span>//     }</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>519. Random Flip Matrix<a href="#519-random-flip-matrix"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/random-flip-matrix/" target="_blank">https://leetcode.com/problems/random-flip-matrix/</a></p><hr /><p>把二维数组看成一个长度为<code>m * n</code>的序列，问题转化为每一轮保持均匀地从序列中随机抽取一个数，直到抽完为止。</p><p>根据Fisher–Yates shuffle算法中的modern method，每抽一个数，都会使得剩余序列的长度变短，这时候我们需要将剩余序列中最后一个未被选择的数替换到当前被抽取的数的位置上。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>Integer</span><span><span>,</span><span> </span></span><span>Integer</span><span><span>&gt;</span><span> map </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span><span> row</span><span>,</span><span> col</span><span>,</span><span> total</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>Random</span><span> rand </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Random</span><span><span>()</span><span>;</span></span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>public</span><span> </span><span>Solution</span><span>(</span><span>int</span><span><span> </span><span>m</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>row </span><span>=</span><span> m;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>col </span><span>=</span><span> n;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>total </span><span>=</span><span> row </span><span>*</span><span> col;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>flip</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>13</div></div><div><span>        </span><span>// generate index, decrease total number of values</span></div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span> </span><span>r</span><span> </span></span><span><span>=</span><span> </span></span><span>rand</span><span>.</span><span>nextInt</span><span>(total);</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>total--;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// check if we have already put something at this index</span></div></div><div><div><div>18</div></div><div><span>        </span><span>int</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>getOrDefault</span><span>(r, r);</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// swap, put total at index that we generated</span></div></div><div><div><div>21</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(r, </span><span>map</span><span>.</span><span>getOrDefault</span><span>(total, total));</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span><span>[]{x </span><span>/</span><span> col, x </span><span>%</span><span> col};</span></span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>reset</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>map</span><span>.</span><span>clear</span><span>();</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>total </span><span>=</span><span> row </span><span>*</span><span> col;</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>/**</span></div></div><div><div><div>33</div></div><div><span><span> </span></span><span>* Your Solution object will be instantiated and called as such:</span></div></div><div><div><div>34</div></div><div><span><span> </span></span><span>* Solution obj = new Solution(m, n);</span></div></div><div><div><div>35</div></div><div><span><span> </span></span><span>* int[] param_1 = obj.flip();</span></div></div><div><div><div>36</div></div><div><span><span> </span></span><span>* obj.reset();</span></div></div><div><div><div>37</div></div><div><span><span> </span></span><span>*/</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>520. Detect Capital<a href="#520-detect-capital"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/detect-capital/" target="_blank">https://leetcode.com/problems/detect-capital/</a></p><hr /><p>统计大写字母的个数，这个个数只能是0，1或者和<code>word</code>一样长。如果是1，这个大写字母必须是首字母。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>detectCapitalUse</span><span>(</span><span>String</span><span><span> </span><span>word</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>wordArray</span><span> </span></span><span><span>=</span><span> </span></span><span>word</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>wordArray</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span><span> (wordArray[i] </span><span>&gt;=</span><span> </span></span><span>'A'</span><span><span> </span><span>&amp;&amp;</span><span> wordArray[i] </span><span>&lt;=</span><span> </span></span><span>'Z'</span><span>) {</span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>count++;</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span><span> count </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span></span></div></div><div><div><div>13</div></div><div><span><span>               </span></span><span>count </span><span>==</span><span> </span><span>wordArray</span><span>.</span><span>length</span><span><span> </span><span>||</span></span></div></div><div><div><div>14</div></div><div><span><span>               </span></span><span>(count </span><span>==</span><span> </span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> wordArray[</span></span><span>0</span><span><span>] </span><span>&gt;=</span><span> </span></span><span>'A'</span><span><span> </span><span>&amp;&amp;</span><span> wordArray[</span></span><span>0</span><span><span>] </span><span>&lt;=</span><span> </span></span><span>'Z'</span><span>);</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>521. Longest Uncommon Subsequence I<a href="#521-longest-uncommon-subsequence-i"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-uncommon-subsequence-i/" target="_blank">https://leetcode.com/problems/longest-uncommon-subsequence-i/</a></p><hr /><p>如果两个字符串一模一样，就不存在LUS；否则，LUS就直接返回两个字符串中较长的那个，因为很显然较长的那个不可能是较短的那个的子字符串。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findLUSlength</span><span>(</span><span>String</span><span><span> </span><span>a</span><span>, </span></span><span>String</span><span><span> </span><span>b</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span> </span><span>a</span><span>.</span><span>equals</span><span>(b) </span><span>?</span><span><span> </span><span>-</span></span><span>1</span><span> </span><span>:</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(</span><span>a</span><span>.</span><span>length</span><span>(), </span><span>b</span><span>.</span><span>length</span><span>());</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>522. Longest Uncommon Subsequence II<a href="#522-longest-uncommon-subsequence-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-uncommon-subsequence-ii/" target="_blank">https://leetcode.com/problems/longest-uncommon-subsequence-ii/</a></p><hr /><p>两层循环，判断当前字符串是否是其他任意字符串的子序列，如果不存在，当前字符串就是一个可能的LUS，根据它的长度决定是否更新已有的最大值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findLUSlength</span><span>(</span><span>String</span><span><span>[] </span><span>strs</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span><span>-</span></span><span>1</span><span><span>, n </span><span>=</span><span> </span></span><span>strs</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>5</div></div><div><span>            </span><span>if</span><span> (strs[i].</span><span>length</span><span><span>() </span><span>&lt;</span><span> result) {</span></span></div></div><div><div><div>6</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span><span>-</span></span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span>            </span><span>while</span><span><span> (++j </span><span>&lt;</span><span> n) {</span></span></div></div><div><div><div>11</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>!=</span><span> j </span><span>&amp;&amp;</span><span> </span></span><span>isSubsequence</span><span>(strs[i], strs[j])) {</span></div></div><div><div><div>12</div></div><div><span>                    </span><span>break</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>            </span><span>// current string is not subsequence of any other string</span></div></div><div><div><div>17</div></div><div><span>            </span><span>if</span><span><span> (j </span><span>==</span><span> n) {</span></span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, strs[i].</span><span>length</span><span>());</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isSubsequence</span><span>(</span><span>String</span><span><span> </span><span>a</span><span>, </span></span><span>String</span><span><span> </span><span>b</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, j </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>a</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> j </span><span>&lt;</span><span> </span></span><span>b</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>if</span><span> (</span><span>a</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>b</span><span>.</span><span>charAt</span><span>(j++)) {</span></div></div><div><div><div>30</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>return</span><span><span> i </span><span>==</span><span> </span></span><span>a</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>523. Continuous Subarray Sum<a href="#523-continuous-subarray-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/continuous-subarray-sum/" target="_blank">https://leetcode.com/problems/continuous-subarray-sum/</a></p><hr /><p>使用一个变量<code>curSum</code>，循环遍历数组的同时，用<code>curSum</code>记录截止每一位时的累加数值，然后再用<code>curMod</code>保存<code>curSum</code>与<code>k</code>的模，并且用HashMap把这个数值和下标对应起来。当前的<code>curMod</code>如果和之前的重复了，说明中间这一段子数组的和一定是<code>k</code>的倍数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>checkSubarraySum</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&lt;</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// &lt;mod value, index&gt;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// the first subarray with first two numbers in array could form the result</span></div></div><div><div><div>11</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(</span><span>0</span><span><span>, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span> </span><span>curSum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span> </span><span>curMod</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>15</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>curSum </span><span>+=</span><span> nums[i];</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>            </span><span>// corner case: k CANNOT be 0 when we use a number mod k</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>curMod </span><span>=</span><span> k </span><span>!=</span><span> </span><span>0</span><span> </span><span>?</span><span><span> curSum </span><span>%</span><span> k </span></span><span>:</span><span> curSum;</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>// the mode repeat again, so numbers between them should be a multiple of k</span></div></div><div><div><div>22</div></div><div><span>            </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span>(curMod)) {</span></div></div><div><div><div>23</div></div><div><span>                </span><span>// subarray of size at least 2</span></div></div><div><div><div>24</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>-</span><span> </span></span><span>map</span><span>.</span><span>get</span><span><span>(curMod) </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>                    </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>28</div></div><div><span>                </span><span>map</span><span>.</span><span>put</span><span>(curMod, i);</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>524. Longest Word in Dictionary through Deleting<a href="#524-longest-word-in-dictionary-through-deleting"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-word-in-dictionary-through-deleting/" target="_blank">https://leetcode.com/problems/longest-word-in-dictionary-through-deleting/</a></p><hr /><p>遍历<code>d</code>中每个单词，首先要找到某个单词能够成为<code>s</code>的子序列，其次这个单词要越长越好。如果有多个相同长度的这种单词，用<code>compareTo()</code>方法找到字典序最小的即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>findLongestWord</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>d</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>String</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>""</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>word</span></span><span>:</span><span> d) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>if</span><span> ((</span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>result</span><span>.</span><span>length</span><span><span>() </span><span>||</span><span> </span></span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>result</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>word</span><span>.</span><span>compareTo</span><span><span>(result) </span><span>&lt;</span><span> </span></span><span>0</span><span><span>) </span><span>&amp;&amp;</span><span> </span></span><span>isSubsequence</span><span>(word, s)) {</span></div></div><div><div><div>7</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> word;</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isSubsequence</span><span>(</span><span>String</span><span><span> </span><span>a</span><span>, </span></span><span>String</span><span><span> </span><span>b</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>15</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, j </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>a</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> j </span><span>&lt;</span><span> </span></span><span>b</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>if</span><span> (</span><span>a</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>b</span><span>.</span><span>charAt</span><span>(j++)) {</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span><span> i </span><span>==</span><span> </span></span><span>a</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>525. Contiguous Array<a href="#525-contiguous-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/contiguous-array/" target="_blank">https://leetcode.com/problems/contiguous-array/</a></p><hr /><p>用HashMap统计数组开头到每个下标的子数组和，如果发现当前的和重复，说明数组中出现了为和0的子数组序列，计算出下标差并更新最大值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findMaxLength</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>sumToIndex</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>sumToIndex</span><span>.</span><span>put</span><span>(</span><span>0</span><span><span>, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, result </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>sum </span><span>+=</span><span> (nums[i] </span><span>*</span><span> </span><span>2</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>); </span><span>// 0 -&gt; -1, 1 -&gt; 1</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span> (</span><span>sumToIndex</span><span>.</span><span>containsKey</span><span>(sum)) {</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, i </span><span>-</span><span> </span></span><span>sumToIndex</span><span>.</span><span>get</span><span>(sum));</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>sumToIndex</span><span>.</span><span>put</span><span>(sum, i);</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>526. Beautiful Arrangement<a href="#526-beautiful-arrangement"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/beautiful-arrangement/" target="_blank">https://leetcode.com/problems/beautiful-arrangement/</a></p><hr /><p>回溯算法，从数组尾开始向前，循环遍历并跟起始数交换，看是否满足，如果满足就向前进一步移动起始数，直至数组头。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> count </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>swap</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>tmp</span><span> </span></span><span><span>=</span><span> nums[i];</span></span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>nums[i] </span><span>=</span><span> nums[j];</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>nums[j] </span><span>=</span><span> tmp;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>helper</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>start</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>11</div></div><div><span>        </span><span>// reach array start, add total count</span></div></div><div><div><div>12</div></div><div><span>        </span><span>if</span><span><span> (start </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>count++;</span></div></div><div><div><div>14</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>// backtrack, try each pair then restore</span></div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> start; i </span><span>&gt;</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>swap</span><span>(nums, start, i);</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>            </span><span>// arrange one num, move start forward</span></div></div><div><div><div>22</div></div><div><span>            </span><span>if</span><span><span> (nums[start] </span><span>%</span><span> start </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> start </span><span>%</span><span> nums[start] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>                </span><span>helper</span><span><span>(nums, start </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>            </span><span>swap</span><span>(nums, i, start);</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>countArrangement</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>nums</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[n </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>32</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>nums[i] </span><span>=</span><span> i;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>// start from n</span></div></div><div><div><div>37</div></div><div><span>        </span><span>helper</span><span>(nums, n);</span></div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> count;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>527. Word Abbreviation<a href="#527-word-abbreviation"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/word-abbreviation/" target="_blank">https://leetcode.com/problems/word-abbreviation/</a></p><hr /><p>初始情况下，先找出每个单词的最短缩写，即首字母 + 中间缩略长度 + 末字母。用这样的缩写作为key，建立HashMap，value是缩写相同的单词集合，并同时存储了单词本身与单词的下标。</p><p>对于缩写重复的单词，尝试找到最长公共前缀，这样就能确定缩写的前缀长度至少要达到多少才能使得前缀唯一。</p><p>此题的一大技巧是同时存储单词本身与下标，这样使得后续修改前缀时直接从map中读取单词位置，始终能在<code>O(1)</code>时间内完成修改，加快运行效率。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>class</span><span><span> </span><span>IndexToWord</span><span> </span></span><span>{</span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span> index</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>String</span><span> word</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>public</span><span> </span><span>IndexToWord</span><span>(</span><span>int</span><span><span> </span><span>index</span><span>, </span></span><span>String</span><span><span> </span><span>word</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span>            </span><span>this</span><span>.</span><span>index</span><span><span> </span><span>=</span><span> index;</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>this</span><span>.</span><span>word</span><span><span> </span><span>=</span><span> word;</span></span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>wordsAbbreviation</span><span>(</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>dict</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>String</span><span>, </span><span>List</span><span>&lt;</span><span>IndexToWord</span><span><span>&gt;&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>13</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>dict</span><span>.</span><span>size</span><span>(); i++) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>// use prefix length = 1 to generate initial abbr</span></div></div><div><div><div>17</div></div><div><span>            </span><span>String</span><span><span> </span><span>abbr</span><span> </span></span><span><span>=</span><span> </span></span><span>getAbbr</span><span>(</span><span>dict</span><span>.</span><span>get</span><span>(i), </span><span>1</span><span>);</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>            </span><span>// same abbr cannot be repeatedly added as a key</span></div></div><div><div><div>20</div></div><div><span>            </span><span>map</span><span>.</span><span>putIfAbsent</span><span>(abbr, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;());</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>// words with same abbr are stored in the same list</span></div></div><div><div><div>23</div></div><div><span>            </span><span>map</span><span>.</span><span>get</span><span>(abbr).</span><span>add</span><span>(</span><span>new</span><span> </span><span>IndexToWord</span><span>(i, </span><span>dict</span><span>.</span><span>get</span><span>(i)));</span></div></div><div><div><div>24</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(abbr);</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>for</span><span> (</span><span>List</span><span>&lt;</span><span>IndexToWord</span><span><span>&gt; </span><span>group</span></span><span>:</span><span> </span><span>map</span><span>.</span><span>values</span><span>()) {</span></div></div><div><div><div>28</div></div><div><span>            </span><span>// unique abbr -&gt; word mapping</span></div></div><div><div><div>29</div></div><div><span>            </span><span>if</span><span> (</span><span>group</span><span>.</span><span>size</span><span><span>() </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>30</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>            </span><span>// for words with same abbr, sort in alphabetical order</span></div></div><div><div><div>34</div></div><div><span>            </span><span>Collections</span><span>.</span><span>sort</span><span>(group, (a, b) </span><span>-&gt;</span><span> </span><span>a</span><span>.</span><span>word</span><span>.</span><span>compareTo</span><span>(</span><span>b</span><span>.</span><span>word</span><span>));</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>            </span><span>// find new prefix length to become unique</span></div></div><div><div><div>37</div></div><div><span>            </span><span>int</span><span><span>[] </span><span>lcp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>group</span><span>.</span><span>size</span><span>()];</span></div></div><div><div><div>38</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>group</span><span>.</span><span>size</span><span>(); i++) {</span></div></div><div><div><div>39</div></div><div><span>                </span><span>int</span><span><span> </span><span>p</span><span> </span></span><span><span>=</span><span> </span></span><span>longestCommonPrefix</span><span>(</span><span>group</span><span>.</span><span>get</span><span><span>(i </span><span>-</span><span> </span></span><span>1</span><span>).</span><span>word</span><span>, </span><span>group</span><span>.</span><span>get</span><span>(i).</span><span>word</span><span>);</span></div></div><div><div><div>40</div></div><div><span><span>                </span></span><span>lcp[i] </span><span>=</span><span> p;</span></div></div><div><div><div>41</div></div><div><span><span>                </span></span><span>lcp[i</span><span>-</span><span>1</span><span><span>] </span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>max</span><span><span>(lcp[i</span><span>-</span></span><span>1</span><span>], p);</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>            </span><span>// set abbr to result</span></div></div><div><div><div>45</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>group</span><span>.</span><span>size</span><span>(); i++) {</span></div></div><div><div><div>46</div></div><div><span>                </span><span>result</span><span>.</span><span>set</span><span>(</span><span>group</span><span>.</span><span>get</span><span>(i).</span><span>index</span><span>, </span><span>getAbbr</span><span>(</span><span>group</span><span>.</span><span>get</span><span>(i).</span><span>word</span><span>, lcp[i]));</span></div></div><div><div><div>47</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>51</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>52</div></div><div>
</div></div><div><div><div>53</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>longestCommonPrefix</span><span>(</span><span>String</span><span><span> </span><span>word1</span><span>, </span></span><span>String</span><span><span> </span><span>word2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>54</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>55</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>word1</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> i </span><span>&lt;</span><span> </span></span><span>word2</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>word1</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>word2</span><span>.</span><span>charAt</span><span>(i)) {</span></div></div><div><div><div>56</div></div><div><span><span>            </span></span><span>i++;</span></div></div><div><div><div>57</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>58</div></div><div><span>        </span><span>return</span><span><span> i </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>59</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>60</div></div><div>
</div></div><div><div><div>61</div></div><div><span>    </span><span>private</span><span> </span><span>String</span><span> </span><span>getAbbr</span><span>(</span><span>String</span><span><span> </span><span>word</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>62</div></div><div><span>        </span><span>if</span><span> (</span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>&lt;=</span><span> </span></span><span>3</span><span><span> </span><span>||</span><span> i</span><span>+</span></span><span>2</span><span><span> </span><span>&gt;=</span><span> </span></span><span>word</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>63</div></div><div><span>            </span><span>return</span><span> word;</span></div></div><div><div><div>64</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>65</div></div><div>
</div></div><div><div><div>66</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>67</div></div><div><span>        </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>word</span><span>.</span><span>substring</span><span>(</span><span>0</span><span>, i)); </span><span>// first i characters to make prefix unique</span></div></div><div><div><div>68</div></div><div><span>        </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> i </span><span>-</span><span> </span></span><span>1</span><span>); </span><span>// abbr length</span></div></div><div><div><div>69</div></div><div><span>        </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>word</span><span>.</span><span>substring</span><span>(</span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>)); </span><span>// last char</span></div></div><div><div><div>70</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>71</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>72</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>528. Random Pick with Weight<a href="#528-random-pick-with-weight"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/random-pick-with-weight/" target="_blank">https://leetcode.com/problems/random-pick-with-weight/</a></p><hr /><p>用一个长度为100的数组表示总共100%的权重和。计算每一个数的权重百分比，如果一个数权重为w，就给它在数组中分配w的长度（用它的下标给这一段区间赋值），以此类推。</p><p>由于每个数的<code>weight</code>都转化成了整数，因此对于非整数的<code>weight</code>有一定的精度损失，这导致实际上最终的<code>weight</code>的之和并不一定是100。为此，我们需要用一个<code>size</code>变量，累计所有的整数<code>weight</code>和，这个才是最终随机pick时的范围。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>// total weight is always 100%</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] map </span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>100</span><span><span>]</span><span>;</span></span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>// total int weight length</span></div></div><div><div><div>7</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> size </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>public</span><span> </span><span>Solution</span><span>(</span><span>int</span><span><span>[] </span><span>w</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>// sum of all nums</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>total</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> w) {</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>total </span><span>+=</span><span> num;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>w</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>// calculate each number's weight, then allocate the space proportional to the weight</span></div></div><div><div><div>18</div></div><div><span>            </span><span>int</span><span><span> </span><span>weight</span><span> </span></span><span><span>=</span><span> (</span></span><span>int</span><span><span>)(w[i] </span><span>*</span><span> </span></span><span>100.0</span><span><span> </span><span>/</span><span> total);</span></span></div></div><div><div><div>19</div></div><div><span>            </span><span>while</span><span><span> (weight-- </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>map[size] </span><span>=</span><span> i;</span></div></div><div><div><div>21</div></div><div><span><span>                </span></span><span>size++;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>pickIndex</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>return</span><span> map[(</span><span>int</span><span>)(</span><span>Math</span><span>.</span><span>random</span><span><span>() </span><span>*</span><span> size)];</span></span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>/**</span></div></div><div><div><div>32</div></div><div><span><span> </span></span><span>* Your Solution object will be instantiated and called as such:</span></div></div><div><div><div>33</div></div><div><span><span> </span></span><span>* Solution obj = new Solution(w);</span></div></div><div><div><div>34</div></div><div><span><span> </span></span><span>* int param_1 = obj.pickIndex();</span></div></div><div><div><div>35</div></div><div><span><span> </span></span><span>*/</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>529. Minesweeper<a href="#529-minesweeper"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minesweeper/" target="_blank">https://leetcode.com/problems/minesweeper/</a></p><hr /><p>dfs递归检查邻近方格，检查时可以借助bfs思想遍历8个方向，直到遇到某个方格周围有雷，终止递归。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>char</span><span>[][] </span><span>updateBoard</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>, </span></span><span>int</span><span><span>[] </span><span>click</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>board</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> board[</span></span><span>0</span><span>].</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> </span></span><span>click</span><span>.</span><span>length</span><span><span> </span><span>!=</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> board;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> click[</span></span><span>0</span><span><span>], y </span><span>=</span><span> click[</span></span><span>1</span><span><span>], m </span><span>=</span><span> </span></span><span>board</span><span>.</span><span>length</span><span><span>, n </span><span>=</span><span> board[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>if</span><span><span> (board[x][y] </span><span>==</span><span> </span></span><span>'M'</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>// reveal the mine</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>board[x][y] </span><span>=</span><span> </span><span>'X'</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>// dfs check the board</span></div></div><div><div><div>13</div></div><div><span>            </span><span>int</span><span><span>[][] </span><span>dirs</span><span> </span></span><span><span>=</span><span> {</span></span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>{</span><span>1</span><span>, </span><span>0</span><span><span>}, {</span><span>-</span></span><span>1</span><span>, </span><span>0</span><span>}, {</span><span>0</span><span>, </span><span>1</span><span>}, {</span><span>0</span><span><span>, </span><span>-</span></span><span>1</span><span>}, {</span><span>1</span><span>, </span><span>1</span><span>}, {</span><span>1</span><span><span>, </span><span>-</span></span><span>1</span><span><span>}, {</span><span>-</span></span><span>1</span><span>, </span><span>1</span><span><span>}, {</span><span>-</span></span><span>1</span><span><span>, </span><span>-</span></span><span>1</span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>dfs</span><span>(board, x, y, m, n, dirs);</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> board;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>, </span></span><span>int</span><span><span> </span><span>m</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span>[][] </span><span>dirs</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (x </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> x </span><span>&gt;=</span><span> m </span><span>||</span><span> y </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> y </span><span>&gt;=</span><span> n </span><span>||</span><span> board[x][y] </span><span>!=</span><span> </span></span><span>'E'</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>int</span><span><span> </span><span>mine</span><span> </span></span><span><span>=</span><span> </span></span><span>adjMine</span><span>(board, x, y, m, n);</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>if</span><span><span> (mine </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>31</div></div><div><span>            </span><span>// count total mine numbers</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>board[x][y] </span><span>=</span><span> (</span><span>char</span><span>) (</span><span>'0'</span><span><span> </span><span>+</span><span> mine);</span></span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>34</div></div><div><span>            </span><span>// no adjacent mines, recursively reveal adjacent unrevealed squares</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>board[x][y] </span><span>=</span><span> </span><span>'B'</span><span>;</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>            </span><span>// try all directions</span></div></div><div><div><div>38</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>d</span><span> </span></span><span>:</span><span> dirs) {</span></div></div><div><div><div>39</div></div><div><span>                </span><span>dfs</span><span><span>(board, x </span><span>+</span><span> d[</span></span><span>0</span><span><span>], y </span><span>+</span><span> d[</span></span><span>1</span><span>], m, n, dirs);</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>adjMine</span><span>(</span><span>char</span><span><span>[][] </span><span>board</span><span>, </span></span><span>int</span><span><span> </span><span>x</span><span>, </span></span><span>int</span><span><span> </span><span>y</span><span>, </span></span><span>int</span><span><span> </span><span>m</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>45</div></div><div><span>        </span><span>int</span><span><span> </span><span>count</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>46</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> x </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> x </span><span>+</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>47</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> y </span><span>-</span><span> </span></span><span>1</span><span><span>; j </span><span>&lt;=</span><span> y </span><span>+</span><span> </span></span><span>1</span><span>; j++) {</span></div></div><div><div><div>48</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> i </span><span>&lt;</span><span> m </span><span>&amp;&amp;</span><span> j </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> j </span><span>&lt;</span><span> n </span><span>&amp;&amp;</span><span> board[i][j] </span><span>==</span><span> </span></span><span>'M'</span><span>) {</span></div></div><div><div><div>49</div></div><div><span><span>                    </span></span><span>count++;</span></div></div><div><div><div>50</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>52</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span>        </span><span>return</span><span> count;</span></div></div><div><div><div>55</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>56</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>530. Minimum Absolute Difference in BST<a href="#530-minimum-absolute-difference-in-bst"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minimum-absolute-difference-in-bst/" target="_blank">https://leetcode.com/problems/minimum-absolute-difference-in-bst/</a></p><hr /><p>中序遍历，因为是BST，把所有节点想像成一条数轴上的数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> result </span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>18</div></div><div><span>    </span><span>private</span><span> </span><span>TreeNode</span><span> prev</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>getMinimumDifference</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>21</div></div><div><span>        </span><span>inorder</span><span>(root);</span></div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>inorder</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>inorder</span><span>(</span><span>node</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>if</span><span><span> (prev </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(result, </span><span>Math</span><span>.</span><span>abs</span><span>(</span><span>node</span><span>.</span><span>val</span><span><span> </span><span>-</span><span> </span></span><span>prev</span><span>.</span><span>val</span><span>));</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>prev </span><span>=</span><span> node;</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>inorder</span><span>(</span><span>node</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>531. Lonely Pixel I<a href="#531-lonely-pixel-i"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/lonely-pixel-i/" target="_blank">https://leetcode.com/problems/lonely-pixel-i/</a></p><hr /><p>先遍历一遍<code>picture</code>，遇到一个<code>'B'</code>就把当前行、列中的<code>'B'</code>数量增加1；之后再次遍历，如果某一行或列的<code>'B'</code>数量不是1，就可以直接跳过，节省时间。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findLonelyPixel</span><span>(</span><span>char</span><span><span>[][] </span><span>picture</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>rows</span><span> </span></span><span><span>=</span><span> </span></span><span>picture</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>cols</span><span> </span></span><span><span>=</span><span> picture[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>rowCount</span><span>[] </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[rows];</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>colCount</span><span>[] </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[cols];</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> rows; i++) {</span></span></div></div><div><div><div>10</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> cols; j++) {</span></span></div></div><div><div><div>11</div></div><div><span>                </span><span>if</span><span><span> (picture[i][j] </span><span>==</span><span> </span></span><span>'B'</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>                    </span><span>// current row and col have 1 more black pixel</span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>rowCount[i]++;</span></div></div><div><div><div>14</div></div><div><span><span>                    </span></span><span>colCount[j]++;</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> rows; i++) {</span></span></div></div><div><div><div>20</div></div><div><span>            </span><span>// current row doesn't have only 1 black pixel</span></div></div><div><div><div>21</div></div><div><span>            </span><span>if</span><span><span> (rowCount[i] </span><span>!=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>22</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> cols; j++) {</span></span></div></div><div><div><div>26</div></div><div><span>                </span><span>// current col doesn't have only 1 black pixel</span></div></div><div><div><div>27</div></div><div><span>                </span><span>if</span><span><span> (colCount[j] </span><span>!=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>28</div></div><div><span>                    </span><span>continue</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>                </span><span>if</span><span><span> (picture[i][j] </span><span>==</span><span> </span></span><span>'B'</span><span>) {</span></div></div><div><div><div>32</div></div><div><span><span>                    </span></span><span>result++;</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>532. K-diff Pairs in an Array<a href="#532-k-diff-pairs-in-an-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/k-diff-pairs-in-an-array/" target="_blank">https://leetcode.com/problems/k-diff-pairs-in-an-array/</a></p><hr /><p>首先统计每个数出现的频率。之后分类讨论：</p><ul>
<li><code>k &gt; 0</code>，此时如果一个数<code>num</code>和<code>num + k</code>都在map中，说明这两个数能组成k-diff-pair</li>
<li><code>k == 0</code>，此时如果一个数<code>num</code>出现了不止一次，也算作两个数组成了k-diff-pair</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findPairs</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// &lt;number, number's frequency&gt;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(num, </span><span>map</span><span>.</span><span>getOrDefault</span><span>(num, </span><span>0</span><span><span>) </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> </span><span>map</span><span>.</span><span>keySet</span><span>()) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>// assume k &gt; 0 and num is the smaller one in the k-diff pair</span></div></div><div><div><div>13</div></div><div><span>            </span><span>// or k == 0 and there is more than one num in the map</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span><span> ((k </span><span>&gt;</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>map</span><span>.</span><span>containsKey</span><span><span>(num </span><span>+</span><span> k)) </span><span>||</span><span> (k </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>map</span><span>.</span><span>get</span><span><span>(num) </span><span>&gt;</span><span> </span></span><span>1</span><span>)) {</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>result++;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>533. Lonely Pixel II<a href="#533-lonely-pixel-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/lonely-pixel-ii/" target="_blank">https://leetcode.com/problems/lonely-pixel-ii/</a></p><hr /><p>与lonely-pixel-i类似，先遍历<code>picture</code>，遇到<code>'B'</code>就让每一行、列的<code>'B'</code>数量增加1。之后检查两条rule，先排除行列不为N个<code>'B'</code>的情况，再判断对应的行列是否存在相同的<code>'B'</code>。可以使用List完成这个目标。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findBlackPixel</span><span>(</span><span>char</span><span><span>[][] </span><span>picture</span><span>, </span></span><span>int</span><span><span> </span><span>N</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>rowsLength</span><span> </span></span><span><span>=</span><span> </span></span><span>picture</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>colsLength</span><span> </span></span><span><span>=</span><span> picture[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[rowsLength];</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>column</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[colsLength];</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> rowsLength; i++) {</span></span></div></div><div><div><div>11</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> colsLength; j++) {</span></span></div></div><div><div><div>12</div></div><div><span>                </span><span>if</span><span><span> (picture[i][j] </span><span>==</span><span> </span></span><span>'B'</span><span>) {</span></div></div><div><div><div>13</div></div><div><span>                    </span><span>// current row and col have 1 more black pixel</span></div></div><div><div><div>14</div></div><div><span><span>                    </span></span><span>row[i]++;</span></div></div><div><div><div>15</div></div><div><span><span>                    </span></span><span>column[j]++;</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>// Figure out the rows for each column</span></div></div><div><div><div>21</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> colsLength; j++) {</span></span></div></div><div><div><div>22</div></div><div><span>            </span><span>// current row doesn't have N black pixel</span></div></div><div><div><div>23</div></div><div><span>            </span><span>if</span><span><span> (column[j] </span><span>!=</span><span> N) {</span></span></div></div><div><div><div>24</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>            </span><span>// all columns with 'B' in this row</span></div></div><div><div><div>28</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>rows</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>29</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> rowsLength; i++) {</span></span></div></div><div><div><div>30</div></div><div><span>                </span><span>if</span><span><span> (row[i] </span><span>==</span><span> N </span><span>&amp;&amp;</span><span> picture[i][j] </span><span>==</span><span> </span></span><span>'B'</span><span>) {</span></div></div><div><div><div>31</div></div><div><span>                    </span><span>rows</span><span>.</span><span>add</span><span>(i);</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>            </span><span>// current col doesn't have N black pixel</span></div></div><div><div><div>36</div></div><div><span>            </span><span>if</span><span> (</span><span>rows</span><span>.</span><span>size</span><span><span>() </span><span>!=</span><span> N) {</span></span></div></div><div><div><div>37</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>            </span><span>boolean</span><span><span> </span><span>isEqual</span><span> </span></span><span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>            </span><span>// check for all rows</span></div></div><div><div><div>43</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; k </span><span>&lt;</span><span> </span></span><span>rows</span><span>.</span><span>size</span><span>(); k++) {</span></div></div><div><div><div>44</div></div><div><span>                </span><span>char</span><span><span>[] </span><span>prevRow</span><span> </span></span><span><span>=</span><span> picture[</span></span><span>rows</span><span>.</span><span>get</span><span>(k)];</span></div></div><div><div><div>45</div></div><div><span>                </span><span>char</span><span><span>[] </span><span>currRow</span><span> </span></span><span><span>=</span><span> picture[</span></span><span>rows</span><span>.</span><span>get</span><span><span>(k</span><span>-</span></span><span>1</span><span>)];</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>                </span><span>// rows that have a black pixel at column C, should be exactly the same as row R</span></div></div><div><div><div>48</div></div><div><span>                </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>r</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; r </span><span>&lt;</span><span> </span></span><span>prevRow</span><span>.</span><span>length</span><span>; r++) {</span></div></div><div><div><div>49</div></div><div><span>                    </span><span>if</span><span><span> (prevRow[r] </span><span>!=</span><span> currRow[r]) {</span></span></div></div><div><div><div>50</div></div><div><span><span>                        </span></span><span>isEqual </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>51</div></div><div><span>                        </span><span>break</span><span>;</span></div></div><div><div><div>52</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>            </span><span>if</span><span> (isEqual) {</span></div></div><div><div><div>57</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> result </span><span>+</span><span> N;</span></div></div><div><div><div>58</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>59</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>60</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>61</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>62</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>534. Game Play Analysis III<a href="#534-game-play-analysis-iii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/game-play-analysis-iii/" target="_blank">https://leetcode.com/problems/game-play-analysis-iii/</a></p><hr /><p><code>activity</code>表自连接，指定一张表的<code>event_date</code>在另一张之后，这样能够选出从某个时间点开始的所有数据。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>a1</span><span>.</span><span>player_id</span><span>, </span><span>a1</span><span>.</span><span>event_date</span><span>, </span><span>SUM</span><span>(</span><span>a2</span><span>.</span><span>games_played</span><span>) </span><span>AS</span><span> games_played_so_far</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> activity </span><span>AS</span><span> a1 </span><span>INNER JOIN</span><span> activity </span><span>AS</span><span> a2</span></div></div><div><div><div>3</div></div><div><span>ON</span><span> </span><span>a1</span><span>.</span><span>event_date</span><span><span> </span><span>&gt;=</span><span> </span></span><span>a2</span><span>.</span><span>event_date</span><span> </span><span>AND</span><span> </span><span>a1</span><span>.</span><span>player_id</span><span><span> </span><span>=</span><span> </span></span><span>a2</span><span>.</span><span>player_id</span></div></div><div><div><div>4</div></div><div><span>GROUP BY</span><span> </span><span>a1</span><span>.</span><span>player_id</span><span>, </span><span>a1</span><span>.</span><span>event_date</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>535. Encode and Decode TinyURL<a href="#535-encode-and-decode-tinyurl"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/encode-and-decode-tinyurl/" target="_blank">https://leetcode.com/problems/encode-and-decode-tinyurl/</a></p><hr /><p>用base64算法，生成<code>longUrl</code>对应的<code>shortUrl</code>，然后用HashMap存储每一组<code>&lt;shortUrl, longUrl&gt;</code>，方便编码和解码。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>Codec</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>Map</span><span>&lt;</span><span>String</span><span><span>,</span><span> </span></span><span>String</span><span><span>&gt;</span><span> map </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> counter </span><span><span>=</span><span> </span></span><span>1000000000</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>// Encodes a URL to a shortened URL.</span></div></div><div><div><div>7</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>encode</span><span>(</span><span>String</span><span><span> </span><span>longUrl</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>--counter;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>String</span><span><span> </span><span>url</span><span> </span></span><span><span>=</span><span> </span></span><span>base64</span><span>(counter);</span></div></div><div><div><div>10</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(url, longUrl);</span></div></div><div><div><div>11</div></div><div><span>        </span><span>return</span><span> url;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>    </span><span>// Decodes a shortened URL to its original URL.</span></div></div><div><div><div>15</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>decode</span><span>(</span><span>String</span><span><span> </span><span>shortUrl</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> </span><span>map</span><span>.</span><span>get</span><span>(shortUrl);</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>static</span><span> </span><span>String</span><span> digits </span><span><span>=</span><span> </span></span><span>"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"</span><span>;</span></div></div><div><div><div>20</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>base64</span><span>(</span><span>int</span><span><span> </span><span>val</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>21</div></div><div><span>        </span><span>StringBuffer</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuffer</span><span>();</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>while</span><span><span> (val </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>int</span><span><span> </span><span>digit</span><span> </span></span><span><span>=</span><span> val </span><span>%</span><span> </span></span><span>64</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>val </span><span>=</span><span> val </span><span>/</span><span> </span><span>64</span><span>;</span></div></div><div><div><div>26</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>digits</span><span>.</span><span>charAt</span><span>(digit));</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>// Your Codec object will be instantiated and called as such:</span></div></div><div><div><div>34</div></div><div><span>// Codec codec = new Codec();</span></div></div><div><div><div>35</div></div><div><span>// codec.decode(codec.encode(url));</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>536. Construct Binary Tree from String<a href="#536-construct-binary-tree-from-string"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/construct-binary-tree-from-string/" target="_blank">https://leetcode.com/problems/construct-binary-tree-from-string/</a></p><hr /><p>使用一个下标<code>idx</code>维护遍历<code>s</code>的进度。每遇到一个整数时，提取其符号以及全部数字，之后用这个数构造一个树节点。</p><p>构造完当前节点后，如果后面遇到了括号，说明进入了更深的递归，即需要构造子树。此时，需要依照先左后右的顺序构造两边子树，注意移动<code>idx</code>跳过每个子树两个括号。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> idx </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>str2tree</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>// decide whether current num is positive or negative</span></div></div><div><div><div>25</div></div><div><span>        </span><span>int</span><span><span> </span><span>negative</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>26</div></div><div><span>        </span><span>int</span><span><span> </span><span>current</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>27</div></div><div><span>        </span><span>if</span><span> (</span><span>s</span><span>.</span><span>charAt</span><span><span>(idx) </span><span>==</span><span> </span></span><span>'-'</span><span>) {</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>negative </span><span>=</span><span> </span><span>-</span><span>1</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>idx++;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>while</span><span><span> (idx </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>Character</span><span>.</span><span>isDigit</span><span>(</span><span>s</span><span>.</span><span>charAt</span><span>(idx))) {</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>current </span><span>=</span><span> current </span><span>*</span><span> </span><span>10</span><span><span> </span><span>+</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span><span>(idx) </span><span>-</span><span> </span></span><span>'0'</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>idx++;</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>        </span><span>// construct current node</span></div></div><div><div><div>38</div></div><div><span>        </span><span>TreeNode</span><span><span> </span><span>root</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>TreeNode</span><span><span>(negative </span><span>*</span><span> current);</span></span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>// left subtree</span></div></div><div><div><div>41</div></div><div><span>        </span><span>if</span><span><span> (idx </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span><span>(idx) </span><span>==</span><span> </span></span><span>'('</span><span>) {</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>idx++; </span><span>// open parenthesis</span></div></div><div><div><div>43</div></div><div><span>            </span><span>root</span><span>.</span><span>left</span><span><span> </span><span>=</span><span> </span></span><span>str2tree</span><span>(s);</span></div></div><div><div><div>44</div></div><div><span><span>            </span></span><span>idx++; </span><span>// close parenthesis</span></div></div><div><div><div>45</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>        </span><span>// right subtree</span></div></div><div><div><div>48</div></div><div><span>        </span><span>if</span><span><span> (idx </span><span>&lt;</span><span> </span></span><span>s</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>s</span><span>.</span><span>charAt</span><span><span>(idx) </span><span>==</span><span> </span></span><span>'('</span><span>) {</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>idx++; </span><span>// open parenthesis</span></div></div><div><div><div>50</div></div><div><span>            </span><span>root</span><span>.</span><span>right</span><span><span> </span><span>=</span><span> </span></span><span>str2tree</span><span>(s);</span></div></div><div><div><div>51</div></div><div><span><span>            </span></span><span>idx++; </span><span>// close parenthesis</span></div></div><div><div><div>52</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span>        </span><span>return</span><span> root;</span></div></div><div><div><div>55</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>56</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>537. Complex Number Multiplication<a href="#537-complex-number-multiplication"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/complex-number-multiplication/" target="_blank">https://leetcode.com/problems/complex-number-multiplication/</a></p><hr /><p>先根据<code>+</code>号split，然后把虚数部分的<code>i</code>去掉，算出新的实虚系数。之后再把整数重新转换为字符串。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>complexNumberMultiply</span><span>(</span><span>String</span><span><span> </span><span>num1</span><span>, </span></span><span>String</span><span><span> </span><span>num2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>part1</span><span> </span></span><span><span>=</span><span> </span></span><span>num1</span><span>.</span><span>split</span><span>(</span><span>"</span><span>\\</span><span>+"</span><span>);</span></div></div><div><div><div>4</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>part2</span><span> </span></span><span><span>=</span><span> </span></span><span>num2</span><span>.</span><span>split</span><span>(</span><span>"</span><span>\\</span><span>+"</span><span>);</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// remove i in both parts</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>x</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>parseInt</span><span>(part1[</span><span>0</span><span>]);</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>y</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>parseInt</span><span>(part1[</span><span>1</span><span>].</span><span>replace</span><span>(</span><span>"i"</span><span>, </span><span>""</span><span>));</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>c</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>parseInt</span><span>(part2[</span><span>0</span><span>]);</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>d</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>parseInt</span><span>(part2[</span><span>1</span><span>].</span><span>replace</span><span>(</span><span>"i"</span><span>, </span><span>""</span><span>));</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// convert integer to string again</span></div></div><div><div><div>13</div></div><div><span>        </span><span>String</span><span><span> </span><span>ansOne</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>toString</span><span><span>(x </span><span>*</span><span> c </span><span>-</span><span> y </span><span>*</span><span> d);</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>String</span><span><span> </span><span>ansTwo</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>toString</span><span><span>(x </span><span>*</span><span> d </span><span>+</span><span> y </span><span>*</span><span> c) </span><span>+</span><span> </span></span><span>"i"</span><span>;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span><span> ansOne </span><span>+</span><span> </span></span><span>"+"</span><span><span> </span><span>+</span><span> ansTwo;</span></span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>538. Convert BST to Greater Tree<a href="#538-convert-bst-to-greater-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/convert-bst-to-greater-tree/" target="_blank">https://leetcode.com/problems/convert-bst-to-greater-tree/</a></p><hr /><p>类似中序遍历，先递归算右子树的总和，之后加上根节点的和，最后再去算左子树。每一步的起始<code>sum</code>都取决于上一步的结果。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>TreeNode</span><span> </span><span>convertBST</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>helper</span><span>(root, </span><span>0</span><span>);</span></div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span> root;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>helper</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>, </span></span><span>int</span><span><span> </span><span>sum</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>23</div></div><div><span>        </span><span>// no node or child</span></div></div><div><div><div>24</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>25</div></div><div><span>            </span><span>return</span><span> sum;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>// sum of right subtree</span></div></div><div><div><div>29</div></div><div><span>        </span><span>int</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span>(</span><span>node</span><span>.</span><span>right</span><span>, sum);</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>// sum of right subtree + current node</span></div></div><div><div><div>32</div></div><div><span>        </span><span>node</span><span>.</span><span>val</span><span><span> </span><span>+=</span><span> right;</span></span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>// sum of left、right subtrees and root node</span></div></div><div><div><div>35</div></div><div><span>        </span><span>return</span><span> </span><span>helper</span><span>(</span><span>node</span><span>.</span><span>left</span><span>, </span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>539. Minimum Time Difference<a href="#539-minimum-time-difference"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minimum-time-difference/" target="_blank">https://leetcode.com/problems/minimum-time-difference/</a></p><hr /><p>把时间转换成分钟，（以0为基准），然后把所有<code>timePoints</code>进行排序，找出相邻两个时间点的最小差值。注意需要额外考虑第一个时间点和最后一个。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>convertTimeToMin</span><span>(</span><span>String</span><span><span> </span><span>time</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>timeSplit</span><span> </span></span><span><span>=</span><span> </span></span><span>time</span><span>.</span><span>split</span><span>(</span><span>":"</span><span>);</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>hour</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>parseInt</span><span>(timeSplit[</span><span>0</span><span>]);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>int</span><span><span> </span><span>minute</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>parseInt</span><span>(timeSplit[</span><span>1</span><span>]);</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span><span> hour </span><span>*</span><span> </span></span><span>60</span><span><span> </span><span>+</span><span> minute;</span></span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findMinDifference</span><span>(</span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>timePoints</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>convertedTime</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>timePoints</span><span>.</span><span>size</span><span>()];</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>timePoints</span><span>.</span><span>size</span><span>(); i++) {</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>convertedTime[i] </span><span>=</span><span> </span><span>convertTimeToMin</span><span>(</span><span>timePoints</span><span>.</span><span>get</span><span>(i));</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(convertedTime);</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>convertedTime</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(result, convertedTime[i</span><span>+</span></span><span>1</span><span><span>] </span><span>-</span><span> convertedTime[i]);</span></span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span>(result, convertedTime[</span><span>0</span><span><span>] </span><span>+</span><span> </span></span><span>1440</span><span><span> </span><span>-</span><span> convertedTime[</span></span><span>convertedTime</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>]);</span></div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>540. Single Element in a Sorted Array<a href="#540-single-element-in-a-sorted-array"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/single-element-in-a-sorted-array/" target="_blank">https://leetcode.com/problems/single-element-in-a-sorted-array/</a></p><hr /><p>正常来说，如果两个数两两配对，所有偶数下标和下一个奇数下标的数都应该是相等的。因此使用二分查找，总是先找到中点偏左的第一个偶数下标。如果这个数和下一个数不相同，说明左半侧的数中有个数落单了，导致正常的奇偶配对产生了下标偏移；反之说明在右半侧。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>singleNonDuplicate</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>start</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, end </span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>while</span><span><span> (start </span><span>&lt;</span><span> end) {</span></span></div></div><div><div><div>6</div></div><div><span>            </span><span>// find the even index if the left part is sorted</span></div></div><div><div><div>7</div></div><div><span>            </span><span>int</span><span><span> </span><span>mid</span><span> </span></span><span><span>=</span><span> start </span><span>+</span><span> (end </span><span>-</span><span> start) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (mid </span><span>%</span><span> </span></span><span>2</span><span><span> </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>mid--;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (nums[mid] </span><span>!=</span><span> nums[mid </span><span>+</span><span> </span></span><span>1</span><span>]) {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>// single is in left part</span></div></div><div><div><div>14</div></div><div><span><span>                 </span></span><span>end </span><span>=</span><span> mid;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>16</div></div><div><span>                </span><span>// single is in right part</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>start </span><span>=</span><span> mid </span><span>+</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> nums[start];</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>541. Reverse String II<a href="#541-reverse-string-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reverse-string-ii/" target="_blank">https://leetcode.com/problems/reverse-string-ii/</a></p><hr /><p>两层循环，外层遍历每<code>2k</code>个字符，内层颠倒每组<code>2k</code>个字符中的前<code>k</code>个字符，注意最后一组可能提前到达结尾。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>reverseStr</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>array</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// for every 2k characters</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; left </span><span>&lt;</span><span> </span></span><span>array</span><span>.</span><span>length</span><span><span>; left </span><span>+=</span><span> </span></span><span>2</span><span><span> </span><span>*</span><span> k) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>// reverse first k characters</span></div></div><div><div><div>8</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> left, j </span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>min</span><span><span>(left </span><span>+</span><span> k </span><span>-</span><span> </span></span><span>1</span><span>, </span><span>array</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span>); i </span><span>&lt;</span><span> j; i++, j--) {</span></span></div></div><div><div><div>9</div></div><div><span>                </span><span>char</span><span><span> </span><span>tmp</span><span> </span></span><span><span>=</span><span> array[i];</span></span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>array[i] </span><span>=</span><span> array[j];</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>array[j] </span><span>=</span><span> tmp;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> </span><span>new</span><span> </span><span>String</span><span>(array);</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>542. 01 Matrix<a href="#542-01-matrix"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/01-matrix/" target="_blank">https://leetcode.com/problems/01-matrix/</a></p><hr /><p>对任意一个方格，最近的0距离不可能超过矩阵的<code>row + col - 1</code>。因此，可以将这个值作为初始的最大值，然后通过动态规划遍历更新最小距离。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[][] </span><span>updateMatrix</span><span>(</span><span>int</span><span><span>[][] </span><span>mat</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>mat</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>col</span><span> </span></span><span><span>=</span><span> mat[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> row; i++) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> col; j++) {</span></span></div></div><div><div><div>8</div></div><div><span>                </span><span>if</span><span><span> (mat[i][j] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>                    </span><span>continue</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>                </span><span>// row + col - 1 is the max distance away for top left cell and bottom right cell</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>mat[i][j] </span><span>=</span><span> row </span><span>+</span><span> col </span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>                    </span><span>// compare with top of current cell</span></div></div><div><div><div>17</div></div><div><span><span>                    </span></span><span>mat[i][j] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(mat[i][j], mat[i </span><span>-</span><span> </span></span><span>1</span><span><span>][j] </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>                </span><span>if</span><span><span> (j </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>                    </span><span>// compare with left of current cell</span></div></div><div><div><div>22</div></div><div><span><span>                    </span></span><span>mat[i][j] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(mat[i][j], mat[i][j </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> row </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> col </span><span>-</span><span> </span></span><span>1</span><span><span>; j </span><span>&gt;=</span><span> </span></span><span>0</span><span>; j--) {</span></div></div><div><div><div>30</div></div><div><span>                </span><span>if</span><span><span> (mat[i][j] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>31</div></div><div><span>                    </span><span>continue</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>&lt;</span><span> row </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>35</div></div><div><span>                    </span><span>// compare with bottom of current cell</span></div></div><div><div><div>36</div></div><div><span><span>                    </span></span><span>mat[i][j] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(mat[i][j], mat[i </span><span>+</span><span> </span></span><span>1</span><span><span>][j] </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>37</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>                </span><span>if</span><span><span> (j </span><span>&lt;</span><span> col </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>40</div></div><div><span>                    </span><span>// compare with right of current cell</span></div></div><div><div><div>41</div></div><div><span><span>                    </span></span><span>mat[i][j] </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(mat[i][j], mat[i][j </span><span>+</span><span> </span></span><span>1</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>        </span><span>return</span><span> mat;</span></div></div><div><div><div>47</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>543. Diameter of Binary Tree<a href="#543-diameter-of-binary-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/diameter-of-binary-tree/" target="_blank">https://leetcode.com/problems/diameter-of-binary-tree/</a></p><hr /><p>要求出任意两个节点间的最大距离，大致的方向就是求出根节点的左右子树的深度，然后把两个树的深度进行累加，用这个累加值来更新最大结果。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> result </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>diameterOfBinaryTree</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>maxDepth</span><span>(root);</span></div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>maxDepth</span><span>(</span><span>TreeNode</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// left and right subtrees' depth</span></div></div><div><div><div>30</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>maxDepth</span><span>(</span><span>node</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>maxDepth</span><span>(</span><span>node</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>// use sum of two subtrees to update result</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, left </span><span>+</span><span> right);</span></span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>// max subtree's depth + root node</span></div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(left, right) </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>544. Output Contest Matches<a href="#544-output-contest-matches"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/output-contest-matches/" target="_blank">https://leetcode.com/problems/output-contest-matches/</a></p><hr /><p>先按顺序把<code>1～n</code>进行排序，然后两两配对，第<code>i</code>支球队和第<code>(n - 1 - i)</code>支球队搭配。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>findContestMatch</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>String</span><span>[n];</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// map each number to corresponding string</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>m[i] </span><span>=</span><span> </span><span>String</span><span>.</span><span>valueOf</span><span><span>(i </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>while</span><span><span> (n </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>// i-th team is paired with (n - 1 - i)-th team</span></div></div><div><div><div>13</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n </span><span>/</span><span> </span></span><span>2</span><span>; i++) {</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>m[i] </span><span>=</span><span> </span><span>"("</span><span><span> </span><span>+</span><span> m[i] </span><span>+</span><span> </span></span><span>","</span><span><span> </span><span>+</span><span> m[n </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>-</span><span> i] </span><span>+</span><span> </span></span><span>")"</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>n </span><span>/=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span> m[</span><span>0</span><span>];</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>545. Boundary of Binary Tree<a href="#545-boundary-of-binary-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/boundary-of-binary-tree/" target="_blank">https://leetcode.com/problems/boundary-of-binary-tree/</a></p><hr /><p>环绕整棵树，分为三个步骤：</p><ol>
<li>从上到下，遍历左边界</li>
<li>从左到右，遍历所有叶子节点</li>
<li>从下到上，遍历右边界</li>
</ol><p>因此，把上述三个步骤写成三个函数。注意到左右的遍历是近似对称的，但由于遍历方向不同，添加根节点的时机也不同。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> result </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span><span>&lt;&gt;</span><span>()</span><span>;</span></span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>boundaryOfBinaryTree</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>root</span><span>.</span><span>val</span><span>); </span><span>// root is boundary as well</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>// root node has no child</span></div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>root</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>27</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// add left, right and leaves boundary</span></div></div><div><div><div>31</div></div><div><span>        </span><span>addLeft</span><span>(</span><span>root</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>32</div></div><div><span>        </span><span>addLeaves</span><span>(root);</span></div></div><div><div><div>33</div></div><div><span>        </span><span>addRight</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>addLeft</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>39</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> (</span></span><span>root</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>root</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>)) {</span></div></div><div><div><div>40</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>        </span><span>// for left boundary, visit root node first then subtree</span></div></div><div><div><div>44</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>root</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>        </span><span>// left subtree is boundary if it exists, otherwise right subtree is boundary</span></div></div><div><div><div>47</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>left</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>48</div></div><div><span>            </span><span>addLeft</span><span>(</span><span>root</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>49</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>50</div></div><div><span>            </span><span>addLeft</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>51</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>52</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>addRight</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>55</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> (</span></span><span>root</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>root</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>)) {</span></div></div><div><div><div>56</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>57</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span>        </span><span>// right subtree is boundary if it exists, otherwise left subtree is boundary</span></div></div><div><div><div>60</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>right</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>61</div></div><div><span>            </span><span>addRight</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>62</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>63</div></div><div><span>            </span><span>addRight</span><span>(</span><span>root</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>64</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>65</div></div><div>
</div></div><div><div><div>66</div></div><div><span>        </span><span>// for right boundary, visit subtree first then root node</span></div></div><div><div><div>67</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>root</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>68</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>69</div></div><div>
</div></div><div><div><div>70</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>addLeaves</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>71</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>72</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>73</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>74</div></div><div>
</div></div><div><div><div>75</div></div><div><span>        </span><span>// only add when there is no child</span></div></div><div><div><div>76</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>left</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>root</span><span>.</span><span>right</span><span><span> </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>77</div></div><div><span>            </span><span>result</span><span>.</span><span>add</span><span>(</span><span>root</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>78</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>79</div></div><div>
</div></div><div><div><div>80</div></div><div><span>        </span><span>addLeaves</span><span>(</span><span>root</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>81</div></div><div><span>        </span><span>addLeaves</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>82</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>83</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>546. Remove Boxes<a href="#546-remove-boxes"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/remove-boxes/" target="_blank">https://leetcode.com/problems/remove-boxes/</a></p><hr /><p>给定<code>boxes[i, j]</code>这段区间，从左边界开始向右搜索连续相同的箱子数量。假设连续相同的最右下标是<code>m</code>，那么之后有两种策略：</p><ol>
<li>先把<code>boxes[m]</code>消除，这样就得到<code>k * k</code>的奖励，剩余的奖励全部产自<code>boxes[i, m - 1]</code></li>
<li>把<code>boxes[m]</code>留着之后再用，那么就要进行比较，看<code>boxes[i, m-1]</code>和<code>boxes[m+1, j]</code>哪一段收益更大</li>
</ol><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>removeBoxes</span><span>(</span><span>int</span><span><span>[] </span><span>boxes</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (boxes </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>boxes</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>size</span><span> </span></span><span><span>=</span><span> </span></span><span>boxes</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[][][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[size][size][size];</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>return</span><span> </span><span>dfs</span><span>(dp, boxes, </span><span>0</span><span><span>, size </span><span>-</span><span> </span></span><span>1</span><span>, </span><span>1</span><span>);</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span>[][][] </span><span>dp</span><span>, </span></span><span>int</span><span><span>[] </span><span>boxes</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span><span> (i </span><span>&gt;</span><span> j) {</span></span></div></div><div><div><div>15</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (i </span><span>==</span><span> j) {</span></span></div></div><div><div><div>17</div></div><div><span>            </span><span>return</span><span><span> k </span><span>*</span><span> k;</span></span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (dp[i][j][k] </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> dp[i][j][k];</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>21</div></div><div><span>            </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>dfs</span><span><span>(dp, boxes, i </span><span>+</span><span> </span></span><span>1</span><span>, j, </span><span>1</span><span><span>) </span><span>+</span><span> k </span><span>*</span><span> k;</span></span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> i </span><span>+</span><span> </span></span><span>1</span><span><span>; m </span><span>&lt;=</span><span> j; m++) {</span></span></div></div><div><div><div>24</div></div><div><span>                </span><span>if</span><span><span> (boxes[i] </span><span>==</span><span> boxes[m]) {</span></span></div></div><div><div><div>25</div></div><div><span><span>                    </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, </span><span>dfs</span><span><span>(dp, boxes, i </span><span>+</span><span> </span></span><span>1</span><span><span>, m </span><span>-</span><span> </span></span><span>1</span><span>, </span><span>1</span><span><span>) </span><span>+</span><span> </span></span><span>dfs</span><span><span>(dp, boxes, m, j, k </span><span>+</span><span> </span></span><span>1</span><span>));</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>dp[i][j][k] </span><span>=</span><span> result;</span></div></div><div><div><div>30</div></div><div><span>            </span><span>return</span><span> result;</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>547. Number of Provinces<a href="#547-number-of-provinces"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/number-of-provinces/" target="_blank">https://leetcode.com/problems/number-of-provinces/</a></p><hr /><p>使用一个一维数组，记录已经访问过的人。每一个人都检查他和其他人是否有朋友关系，如果发现了一组关系就检查这个朋友是否和其他人也有关系，以此dfs下去直到找不到为止。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findCircleNum</span><span>(</span><span>int</span><span><span>[][] </span><span>isConnected</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>boolean</span><span><span>[] </span><span>visited</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span>[</span><span>isConnected</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>visited</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>// a new friend circle</span></div></div><div><div><div>8</div></div><div><span>            </span><span>if</span><span><span> (</span><span>!</span><span>visited[i]) {</span></span></div></div><div><div><div>9</div></div><div><span>                </span><span>dfs</span><span>(isConnected, visited, i);</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>result++;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span>[][] </span><span>isConnected</span><span>, </span></span><span>boolean</span><span><span>[] </span><span>visited</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>visited</span><span>.</span><span>length</span><span>; j++) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>==</span><span> j) {</span></span></div></div><div><div><div>20</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>            </span><span>// check friends one by one</span></div></div><div><div><div>24</div></div><div><span>            </span><span>if</span><span><span> (isConnected[i][j] </span><span>==</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> </span><span>!</span><span>visited[j]) {</span></span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>visited[j] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>                </span><span>// dfs search to check friend's circle</span></div></div><div><div><div>28</div></div><div><span>                </span><span>dfs</span><span>(isConnected, visited, j);</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>548. Split Array with Equal Sum<a href="#548-split-array-with-equal-sum"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/split-array-with-equal-sum/" target="_blank">https://leetcode.com/problems/split-array-with-equal-sum/</a></p><hr /><p>三重循环，暴力破解。注意只有上两段子区间的和相同时，才开启下一重循环。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>splitArray</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>presum</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>nums</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i ++) {</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>presum[i] </span><span>=</span><span> i </span><span>==</span><span> </span><span>0</span><span> </span><span>?</span><span> nums[i] </span><span>:</span><span><span> presum[i </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>+</span><span> nums[i];</span></span></div></div><div><div><div>8</div></div><div><span>            </span><span>map</span><span>.</span><span>putIfAbsent</span><span>(presum[i], </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;());</span></div></div><div><div><div>9</div></div><div><span>            </span><span>map</span><span>.</span><span>get</span><span>(presum[i]).</span><span>add</span><span>(i);</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>13</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>6</span><span>; i++) {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>int</span><span><span> </span><span>target</span><span> </span></span><span><span>=</span><span> presum[i </span><span>-</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>15</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>kIndices</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>getOrDefault</span><span>(presum[</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>-</span><span> target, </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;());</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>k</span><span> </span></span><span>:</span><span> kIndices) {</span></div></div><div><div><div>18</div></div><div><span>                </span><span>if</span><span><span> (k </span><span>&lt;</span><span> n </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> k </span><span>&gt;=</span><span> i </span><span>+</span><span> </span></span><span>4</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>                    </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>jIndices</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>getOrDefault</span><span><span>(presum[k </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>-</span><span> target, </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;());</span></div></div><div><div><div>20</div></div><div><span>                    </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span>:</span><span> jIndices) {</span></div></div><div><div><div>21</div></div><div><span>                        </span><span>if</span><span><span> (j </span><span>&gt;</span><span> i </span><span>+</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> j </span><span>&lt;</span><span> k </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>&amp;&amp;</span><span> presum[j </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>-</span><span> presum[i] </span><span>==</span><span> target) {</span></span></div></div><div><div><div>22</div></div><div><span>                            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>549. Binary Tree Longest Consecutive Sequence II<a href="#549-binary-tree-longest-consecutive-sequence-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-longest-consecutive-sequence-ii/" target="_blank">https://leetcode.com/problems/binary-tree-longest-consecutive-sequence-ii/</a></p><hr /><p>分别统计升序列和降序列的长度。统计时先遍历左子树，从底向上算出最长的升降序列；之后遍历右子树，从底向上算出最长的升降序列并和左子树的已有最大值进行比较；最后后序访问根节点，当前节点的最长连续序列就是升降序列之和，减去重复的长度1（根节点本身）。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> result </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>longestConsecutive</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>helper</span><span>(root);</span></div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[] </span><span>helper</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[] {</span><span>0</span><span>, </span><span>0</span><span>};</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>int</span><span><span> </span><span>increase</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>, decrease </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>30</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>left</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>31</div></div><div><span>            </span><span>int</span><span><span>[] </span><span>l</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span>(</span><span>root</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>32</div></div><div><span>            </span><span>if</span><span> (</span><span>root</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> </span></span><span>root</span><span>.</span><span>left</span><span>.</span><span>val</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>increase </span><span>=</span><span> l[</span><span>0</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>root</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> </span></span><span>root</span><span>.</span><span>left</span><span>.</span><span>val</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>decrease </span><span>=</span><span> l[</span><span>1</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>if</span><span> (</span><span>root</span><span>.</span><span>right</span><span><span> </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>40</div></div><div><span>            </span><span>int</span><span><span>[] </span><span>r</span><span> </span></span><span><span>=</span><span> </span></span><span>helper</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>41</div></div><div><span>            </span><span>if</span><span> (</span><span>root</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> </span></span><span>root</span><span>.</span><span>right</span><span>.</span><span>val</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>increase </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(increase, r[</span><span>0</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span>root</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> </span></span><span>root</span><span>.</span><span>right</span><span>.</span><span>val</span><span><span> </span><span>+</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>44</div></div><div><span><span>                </span></span><span>decrease </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(decrease, r[</span><span>1</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>45</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, increase </span><span>+</span><span> decrease </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>49</div></div><div><span>        </span><span>return</span><span> </span><span>new</span><span> </span><span>int</span><span>[] {increase, decrease};</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>550. Game Play Analysis IV<a href="#550-game-play-analysis-iv"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/game-play-analysis-iv/" target="_blank">https://leetcode.com/problems/game-play-analysis-iv/</a></p><hr /><p>先找出每个玩家的最早登录记录，存为<code>t1</code>表，之后拿<code>t1</code>表和<code>Activity</code>表左连接，看能不能在最早登录日之后的一天继续找到了新的登录数据。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>ROUND</span><span>(</span><span>COUNT</span><span>(</span><span>t2</span><span>.</span><span>player_id</span><span>) / </span><span>COUNT</span><span>(</span><span>t1</span><span>.</span><span>player_id</span><span>), </span><span>2</span><span>) </span><span>AS</span><span> fraction</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> (</span></div></div><div><div><div>3</div></div><div><span>    </span><span>SELECT</span><span> player_id, </span><span>MIN</span><span>(event_date) </span><span>AS</span><span> first_login</span></div></div><div><div><div>4</div></div><div><span>    </span><span>FROM</span><span> Activity</span></div></div><div><div><div>5</div></div><div><span>    </span><span>GROUP BY</span><span> player_id) t1 </span><span>LEFT JOIN</span><span> Activity t2</span></div></div><div><div><div>6</div></div><div><span>ON</span><span> </span><span>t1</span><span>.</span><span>player_id</span><span><span> </span><span>=</span><span> </span></span><span>t2</span><span>.</span><span>player_id</span><span> </span><span>AND</span><span> </span><span>t1</span><span>.</span><span>first_login</span><span><span> </span><span>=</span><span> </span></span><span>t2</span><span>.</span><span>event_date</span><span> - </span><span>1</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>551. Student Attendance Record I<a href="#551-student-attendance-record-i"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/student-attendance-record-i/" target="_blank">https://leetcode.com/problems/student-attendance-record-i/</a></p><hr /><p>分类讨论，注意遇到A或P时，要清空连续L状态。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>checkRecord</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>countOfA</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>continuousL</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span></span><span>:</span><span> </span><span>s</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'A'</span><span>) {</span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>countOfA++;</span></div></div><div><div><div>9</div></div><div><span>                </span><span>if</span><span><span> (countOfA </span><span>&gt;</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>10</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>continuousL </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'P'</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>if</span><span><span> (continuousL </span><span>&gt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>16</div></div><div><span><span>                    </span></span><span>continuousL </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (c </span><span>==</span><span> </span></span><span>'L'</span><span>) {</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>continuousL++;</span></div></div><div><div><div>20</div></div><div><span>                </span><span>if</span><span><span> (continuousL </span><span>&gt;</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>                    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>552. Student Attendance Record II<a href="#552-student-attendance-record-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/student-attendance-record-ii/" target="_blank">https://leetcode.com/problems/student-attendance-record-ii/</a></p><hr /><p>用<code>ApLq</code>来表示某个字符串中包含<code>p</code>个A，并且以<code>q</code>个L结束。根据题意，这边的<code>p</code>只能是0或者1，因为Absent次数最多为1；而<code>q</code>可以是0、1或2，因为连续Late次数最多为2。</p><p>当<code>n = 1</code>时，我们可以列出所有符合rewardable条件的字符串：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>A0L0: P</span></div></div><div><div><div>2</div></div><div><span>A0L1: L</span></div></div><div><div><div>3</div></div><div><span>A0L2:</span></div></div><div><div><div>4</div></div><div><span>A1L0: A</span></div></div><div><div><div>5</div></div><div><span>A1L1:</span></div></div><div><div><div>6</div></div><div><span>A1L2:</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>当<code>n = 2</code>时，我们进一步列举：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>A0L0: LP, PP</span></div></div><div><div><div>2</div></div><div><span>A0L1: PL</span></div></div><div><div><div>3</div></div><div><span>A0L2: LL</span></div></div><div><div><div>4</div></div><div><span>A1L0: AP, LA, PA</span></div></div><div><div><div>5</div></div><div><span>A1L1: AL</span></div></div><div><div><div>6</div></div><div><span>A1L2:</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>归纳总结发现以下状态转化表：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>-----+---------------</span></div></div><div><div><div>2</div></div><div><span>INIT | A -- L -- P --</span></div></div><div><div><div>3</div></div><div><span>-----+---------------</span></div></div><div><div><div>4</div></div><div><span>A0L0 | A1L0 A0L1 A0L0</span></div></div><div><div><div>5</div></div><div><span>A0L1 | A1L0 A0L2 A0L0</span></div></div><div><div><div>6</div></div><div><span>A0L2 | A1L0 Done A0L0</span></div></div><div><div><div>7</div></div><div><span>A1L0 | Done A1L1 A1L0</span></div></div><div><div><div>8</div></div><div><span>A1L1 | Done A1L2 A1L0</span></div></div><div><div><div>9</div></div><div><span>A1L2 | Done Done A1L0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>可以发现：</p><ul>
<li>对于<code>n</code>，<code>A0L0</code>的结果来自于<code>n-1</code>时，<code>A0L0 + A0L1 + A0L2</code>的和（相当于结尾添加一个P）</li>
<li>对于<code>n</code>，<code>A0L1</code>的结果实际上就是<code>n-1</code>时，<code>A0L0</code>的值（相当于结尾添加一个L）</li>
<li>…</li>
</ul><p>根据以上推论，我们可以用一个长度为6的<code>dp</code>数组表示初始情况下<code>n = 1</code>时，<code>A0L0 ～ A1L2对</code>应的字符串数量，之后循环增大<code>n</code>时，用新的值覆盖原来<code>dp</code>数组即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>checkRecord</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// init dp array for n = 1</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>dp</span><span> </span></span><span><span>=</span><span> { </span></span><span>1</span><span>, </span><span>1</span><span>, </span><span>0</span><span>, </span><span>1</span><span>, </span><span>0</span><span>, </span><span>0</span><span> };</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// temp array to store values for new dp array</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>temp</span><span> </span></span><span><span>=</span><span> { </span></span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span> };</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>2</span><span><span>; i </span><span>&lt;=</span><span> n; i++) {</span></span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>temp[</span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>sum</span><span>(dp, </span><span>0</span><span>, </span><span>2</span><span>);</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>temp[</span><span>1</span><span><span>] </span><span>=</span><span> dp[</span></span><span>0</span><span>];</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>temp[</span><span>2</span><span><span>] </span><span>=</span><span> dp[</span></span><span>1</span><span>];</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>temp[</span><span>3</span><span><span>] </span><span>=</span><span> </span></span><span>sum</span><span>(dp, </span><span>0</span><span>, </span><span>5</span><span>);</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>temp[</span><span>4</span><span><span>] </span><span>=</span><span> dp[</span></span><span>3</span><span>];</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>temp[</span><span>5</span><span><span>] </span><span>=</span><span> dp[</span></span><span>4</span><span>];</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>// copy temp values to dp</span></div></div><div><div><div>18</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>6</span><span>; j++) {</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>dp[j] </span><span>=</span><span> temp[j];</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>        </span><span>return</span><span> </span><span>sum</span><span>(dp, </span><span>0</span><span>, </span><span>5</span><span>);</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>sum</span><span>(</span><span>int</span><span><span>[] </span><span>arr</span><span>, </span></span><span>int</span><span><span> </span><span>left</span><span>, </span></span><span>int</span><span><span> </span><span>right</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>27</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>28</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> left; i </span><span>&lt;=</span><span> right; i++) {</span></span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> (result </span><span>+</span><span> arr[i]) </span><span>%</span><span> </span><span>1000000007</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>553. Optimal Division<a href="#553-optimal-division"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/optimal-division/" target="_blank">https://leetcode.com/problems/optimal-division/</a></p><hr /><p>分类讨论：</p><ul>
<li>只有1个数，这个数就是结果</li>
<li>只有2个数，那么第一个数除以第二个数就是结果</li>
<li>超过2个数，第一个数永远是被除数，后面的数依次连续除下去，因此能得到最小的除数，进而得到最大的商</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>optimalDivision</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// only 1 number, result should be number itself</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>return</span><span> </span><span>Integer</span><span>.</span><span>toString</span><span>(nums[</span><span>0</span><span>]);</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>// more than 1 number, the first number should always be dividend</span></div></div><div><div><div>9</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>10</div></div><div><span>        </span><span>sb</span><span>.</span><span>append</span><span>(nums[</span><span>0</span><span>]).</span><span>append</span><span>(</span><span>"/"</span><span>);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// if 2 numbers, the second number should be divisor</span></div></div><div><div><div>13</div></div><div><span>        </span><span>// otherwise, all numbers except the first one should keep dividing</span></div></div><div><div><div>14</div></div><div><span>        </span><span>if</span><span> (</span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(nums[</span><span>1</span><span>]);</span></div></div><div><div><div>16</div></div><div><span>            </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>"("</span><span>);</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(nums[i]);</span></div></div><div><div><div>23</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span><span>(i </span><span>!=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span> </span><span>?</span><span> </span><span>"/"</span><span> </span><span>:</span><span> </span><span>")"</span><span>);</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>554. Brick Wall<a href="#554-brick-wall"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/brick-wall/" target="_blank">https://leetcode.com/problems/brick-wall/</a></p><hr /><p>用一个map存储对于某个下标，有多少行砖块在这个下标长度有缝隙。遍历每一行砖，每经过一块砖就更新一次map，最后看在哪一个下标上，有最多行砖是缝隙，这个地方就是画线的地方，可以保证穿过最少的砖。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> mostCommon </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>leastBricks</span><span>(</span><span>List</span><span>&lt;</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>wall</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>// &lt;index that at least 1 row has edge, row count&gt;</span></div></div><div><div><div>6</div></div><div><span>        </span><span>Map</span><span><span>&lt;</span><span>Integer, Integer</span><span>&gt;</span><span>map </span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>for</span><span> (</span><span>List</span><span><span>&lt;</span><span>Integer</span><span>&gt;</span><span>list </span></span><span>:</span><span> wall) {</span></div></div><div><div><div>9</div></div><div><span>            </span><span>updateMap</span><span>(list, map);</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span> </span><span>wall</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> mostCommon;</span></span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>updateMap</span><span>(</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span>list</span><span>, </span></span><span>Map</span><span>&lt;</span><span>Integer</span><span>,</span><span>Integer</span><span><span>&gt; </span><span>map</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span> </span><span>currRowLen</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>list</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>; i++) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>// get current brick length and add to current row's length</span></div></div><div><div><div>19</div></div><div><span>            </span><span>int</span><span><span> </span><span>brickLen</span><span> </span></span><span><span>=</span><span> </span></span><span>list</span><span>.</span><span>get</span><span>(i);</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>currRowLen </span><span>=</span><span> currRowLen </span><span>+</span><span> brickLen;</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>// update number of rows that have edge on this length</span></div></div><div><div><div>23</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(currRowLen, </span><span>map</span><span>.</span><span>getOrDefault</span><span>(currRowLen, </span><span>0</span><span><span>) </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>mostCommon </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(mostCommon, </span><span>map</span><span>.</span><span>get</span><span>(currRowLen));</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>555. Split Concatenated Strings<a href="#555-split-concatenated-strings"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/split-concatenated-strings/" target="_blank">https://leetcode.com/problems/split-concatenated-strings/</a></p><hr /><p>用StringBuilder把所有字符串连起来，转换到2倍复制扩容的char array里，之后分正序和倒序两种情况进行讨论，注意倒序的时候需要同时颠倒char array中前半段本体和后半段复制体。</p><p>此题运用了不少Java Arrays相关的API，可以较快帮助实现数组复制、比较等麻烦的操作：</p><ul>
<li><code>Arrays.copyOf(Object[] original, int newLength)</code>: 从<code>original</code>对象数组中拷贝所有内容到新数组，并且使得新数组的长度为<code>newLength</code>。看长度变化，决定是否需要截断后续元素，或者是补0</li>
<li><code>System.arrayCopy(Object[] src, int srcPos, Object[] dest, int destPos, int length)</code>: 从<code>src</code>指定位置，拷贝<code>length</code>长度的元素到<code>dest</code>的指定位置</li>
<li><code>Arrays.compare(Object[] a, int aFromIndex, int aToIndex, Object[] b, int bFromIndex, int bToIndex)</code>: 用字典序比较a<code>[aFromIndex, aToIndex]</code>和<code>b[bFromIndex, bToIndex]</code></li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>splitLoopedString</span><span>(</span><span>String</span><span><span>[] </span><span>strs</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>concatted</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// for each string, decide whether to add original or reversed version based on lexicographical order</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>strs</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>StringBuilder</span><span><span> </span><span>reversed</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>(strs[i]).</span><span>reverse</span><span>();</span></div></div><div><div><div>8</div></div><div><span>            </span><span>concatted</span><span>.</span><span>append</span><span>(</span><span>CharSequence</span><span>.</span><span>compare</span><span><span>(strs[i], reversed) </span><span>&gt;</span><span> </span></span><span>0</span><span> </span><span>?</span><span> strs[i] </span><span>:</span><span> reversed);</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span> </span><span>totalLength</span><span> </span></span><span><span>=</span><span> </span></span><span>concatted</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>12</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>char</span><span>[totalLength];</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>// duplicate dc</span></div></div><div><div><div>15</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>dc</span><span> </span></span><span><span>=</span><span> </span></span><span>Arrays</span><span>.</span><span>copyOf</span><span>(</span><span>concatted</span><span>.</span><span>toString</span><span>().</span><span>toCharArray</span><span><span>(), totalLength </span><span>*</span><span> </span></span><span>2</span><span>);</span></div></div><div><div><div>16</div></div><div><span>        </span><span>System</span><span>.</span><span>arraycopy</span><span>(dc, </span><span>0</span><span>, dc, totalLength, totalLength);</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, k </span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>strs</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>// normal compare, copy dc to result</span></div></div><div><div><div>20</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> strs[i].</span></span><span>length</span><span>(); j++) {</span></div></div><div><div><div>21</div></div><div><span>                </span><span>if</span><span> (</span><span>Arrays</span><span>.</span><span>compare</span><span>(result, </span><span>0</span><span><span>, totalLength, dc, k </span><span>+</span><span> j, k </span><span>+</span><span> j </span><span>+</span><span> totalLength) </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>22</div></div><div><span>                    </span><span>System</span><span>.</span><span>arraycopy</span><span><span>(dc, k </span><span>+</span><span> j, result, </span></span><span>0</span><span>, totalLength);</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>            </span><span>// reverse each k + string's length, then compare, copy dc to result</span></div></div><div><div><div>27</div></div><div><span>            </span><span>reverse</span><span><span>(dc, k, k </span><span>+</span><span> strs[i].</span></span><span>length</span><span>());</span></div></div><div><div><div>28</div></div><div><span>            </span><span>reverse</span><span><span>(dc, k </span><span>+</span><span> totalLength, k </span><span>+</span><span> totalLength </span><span>+</span><span> strs[i].</span></span><span>length</span><span>());</span></div></div><div><div><div>29</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> strs[i].</span></span><span>length</span><span>(); j++) {</span></div></div><div><div><div>30</div></div><div><span>                </span><span>if</span><span> (</span><span>Arrays</span><span>.</span><span>compare</span><span>(result, </span><span>0</span><span><span>, totalLength, dc, k </span><span>+</span><span> j, k </span><span>+</span><span> j </span><span>+</span><span> totalLength) </span><span>&lt;</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>31</div></div><div><span>                    </span><span>System</span><span>.</span><span>arraycopy</span><span><span>(dc, k </span><span>+</span><span> j, result, </span></span><span>0</span><span>, totalLength);</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>            </span><span>// reverse back</span></div></div><div><div><div>36</div></div><div><span>            </span><span>reverse</span><span><span>(dc, k </span><span>+</span><span> totalLength, k </span><span>+</span><span> totalLength </span><span>+</span><span> strs[i].</span></span><span>length</span><span>());</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>k </span><span>+=</span><span> strs[i].</span><span>length</span><span>();</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>        </span><span>return</span><span> </span><span>String</span><span>.</span><span>valueOf</span><span>(result);</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>reverse</span><span>(</span><span>char</span><span><span>[] </span><span>str</span><span>, </span></span><span>int</span><span><span> </span><span>beginIndex</span><span>, </span></span><span>int</span><span><span> </span><span>endIndex</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>45</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> (endIndex </span><span>-</span><span> beginIndex) </span><span>/</span><span> </span></span><span>2</span><span>; i++) {</span></div></div><div><div><div>46</div></div><div><span>            </span><span>char</span><span><span> </span><span>tmp</span><span> </span></span><span><span>=</span><span> str[beginIndex </span><span>+</span><span> i];</span></span></div></div><div><div><div>47</div></div><div><span><span>            </span></span><span>str[beginIndex </span><span>+</span><span> i] </span><span>=</span><span> str[endIndex </span><span>-</span><span> </span><span>1</span><span><span> </span><span>-</span><span> i];</span></span></div></div><div><div><div>48</div></div><div><span><span>            </span></span><span>str[endIndex </span><span>-</span><span> </span><span>1</span><span><span> </span><span>-</span><span> i] </span><span>=</span><span> tmp;</span></span></div></div><div><div><div>49</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>51</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>556. Next Greater Element III<a href="#556-next-greater-element-iii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/next-greater-element-iii/" target="_blank">https://leetcode.com/problems/next-greater-element-iii/</a></p><hr /><p>与此前的Next Permutation问题完全一致，唯一区别在于输入参数从数组变成了整数，因此只需要把输入的整数转换成数组，然后用此前的解法找出下一组Permutation，最后再重新转换回整数。注意，如果发现转换的整数不大于输入的整数，说明不存在Next Greater Element。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[] </span><span>toArray</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>list</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>while</span><span><span> (n </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>list</span><span>.</span><span>add</span><span><span>(n </span><span>%</span><span> </span></span><span>10</span><span>);</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>n </span><span>/=</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>list</span><span>.</span><span>size</span><span>()];</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>result</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>result[i] </span><span>=</span><span> </span><span>list</span><span>.</span><span>get</span><span>(</span><span>result</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>-</span><span> i);</span></span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>toInt</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>result </span><span>*=</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> i;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>nextPermutation</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span><span> (nums </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>&lt;=</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// search from right to left and find the first element to upset the ascending order</span></div></div><div><div><div>30</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>31</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&gt;=</span><span> </span></span><span>0</span><span><span> </span><span>&amp;&amp;</span><span> nums[i] </span><span>&gt;=</span><span> nums[i</span><span>+</span></span><span>1</span><span>]) {</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>i--;</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>// if there is an element that upsets the ascending order</span></div></div><div><div><div>36</div></div><div><span>        </span><span>if</span><span><span> (i </span><span>&gt;=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>37</div></div><div><span>            </span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>            </span><span>// find the rightmost element which is larger than nums[i]</span></div></div><div><div><div>40</div></div><div><span>            </span><span>while</span><span><span> (nums[i] </span><span>&gt;=</span><span> nums[j]) {</span></span></div></div><div><div><div>41</div></div><div><span><span>                </span></span><span>j--;</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>            </span><span>// swap nums[i] and nums[j]</span></div></div><div><div><div>45</div></div><div><span>            </span><span>swap</span><span>(nums, i, j);</span></div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span>        </span><span>// reverse all elements after index i</span></div></div><div><div><div>48</div></div><div><span>        </span><span>reverseArray</span><span><span>(nums, i </span><span>+</span><span> </span></span><span>1</span><span>, </span><span>nums</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>49</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>    </span><span>// swap two nums</span></div></div><div><div><div>52</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>swap</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>53</div></div><div><span>        </span><span>int</span><span><span> </span><span>temp</span><span> </span></span><span><span>=</span><span> nums[i];</span></span></div></div><div><div><div>54</div></div><div><span><span>        </span></span><span>nums[i] </span><span>=</span><span> nums[j];</span></div></div><div><div><div>55</div></div><div><span><span>        </span></span><span>nums[j] </span><span>=</span><span> temp;</span></div></div><div><div><div>56</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>57</div></div><div>
</div></div><div><div><div>58</div></div><div><span>    </span><span>// reverse a part of the array</span></div></div><div><div><div>59</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>reverseArray</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>60</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> j) {</span></span></div></div><div><div><div>61</div></div><div><span>            </span><span>swap</span><span>(nums, i, j);</span></div></div><div><div><div>62</div></div><div><span><span>            </span></span><span>i++;</span></div></div><div><div><div>63</div></div><div><span><span>            </span></span><span>j--;</span></div></div><div><div><div>64</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>65</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>66</div></div><div>
</div></div><div><div><div>67</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>nextGreaterElement</span><span>(</span><span>int</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>68</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>nums</span><span> </span></span><span><span>=</span><span> </span></span><span>toArray</span><span>(n);</span></div></div><div><div><div>69</div></div><div><span>        </span><span>nextPermutation</span><span>(nums);</span></div></div><div><div><div>70</div></div><div>
</div></div><div><div><div>71</div></div><div><span>        </span><span>int</span><span><span> </span><span>nextNum</span><span> </span></span><span><span>=</span><span> </span></span><span>toInt</span><span>(nums);</span></div></div><div><div><div>72</div></div><div><span>        </span><span>return</span><span><span> nextNum </span><span>&lt;=</span><span> n </span></span><span>?</span><span><span> </span><span>-</span></span><span>1</span><span> </span><span>:</span><span> nextNum;</span></div></div><div><div><div>73</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>74</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>557. Reverse Words in a String III<a href="#557-reverse-words-in-a-string-iii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reverse-words-in-a-string-iii/" target="_blank">https://leetcode.com/problems/reverse-words-in-a-string-iii/</a></p><hr /><p>split分割所有单词，每个单词倒序添加，然后再添加空格。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>reverseWords</span><span>(</span><span>String</span><span><span> </span><span>s</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>words</span><span> </span></span><span><span>=</span><span> </span></span><span>s</span><span>.</span><span>split</span><span>(</span><span>" "</span><span>);</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>word</span><span> </span></span><span>:</span><span> words) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>word</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>8</div></div><div><span>                </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>word</span><span>.</span><span>charAt</span><span>(i));</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>            </span><span>sb</span><span>.</span><span>append</span><span>(</span><span>" "</span><span>);</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>// remove last blank space</span></div></div><div><div><div>14</div></div><div><span>        </span><span>sb</span><span>.</span><span>deleteCharAt</span><span>(</span><span>sb</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> </span><span>sb</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>558. Logical OR of Two Binary Grids Represented as Quad-Trees<a href="#558-logical-or-of-two-binary-grids-represented-as-quad-trees"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/logical-or-of-two-binary-grids-represented-as-quad-trees/" target="_blank">https://leetcode.com/problems/logical-or-of-two-binary-grids-represented-as-quad-trees/</a></p><hr /><p>DFS思想，不断对<code>quad1</code>, <code>quad2</code>同位置四个子树递归求出<code>intersection</code>结果，然后把结果覆盖到<code>quad1</code>上。如果发现当前<code>quad1</code>上是叶子结点，注意要将其子节点设为null。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a QuadTree node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public boolean val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public boolean isLeaf;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>public Node topLeft;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node topRight;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>public Node bottomLeft;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>public Node bottomRight;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>public Node() {}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>public Node(boolean _val,boolean _isLeaf,Node _topLeft,Node _topRight,Node _bottomLeft,Node _bottomRight) {</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>isLeaf = _isLeaf;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>topLeft = _topLeft;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>topRight = _topRight;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>bottomLeft = _bottomLeft;</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>bottomRight = _bottomRight;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>};</span></div></div><div><div><div>22</div></div><div><span>*/</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>25</div></div><div><span>    </span><span>public</span><span> </span><span>Node</span><span> </span><span>intersect</span><span>(</span><span>Node</span><span><span> </span><span>quad1</span><span>, </span></span><span>Node</span><span><span> </span><span>quad2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>// logical bitwise OR</span></div></div><div><div><div>27</div></div><div><span>        </span><span>if</span><span> (</span><span>quad1</span><span>.</span><span>isLeaf</span><span>) {</span></div></div><div><div><div>28</div></div><div><span>            </span><span>return</span><span> </span><span>quad1</span><span>.</span><span>val</span><span>?</span><span> quad1 </span><span>:</span><span> quad2;</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>        </span><span>if</span><span> (</span><span>quad2</span><span>.</span><span>isLeaf</span><span>) {</span></div></div><div><div><div>31</div></div><div><span>            </span><span>return</span><span> </span><span>quad2</span><span>.</span><span>val</span><span>?</span><span> quad2 </span><span>:</span><span> quad1;</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>quad1</span><span>.</span><span>topLeft</span><span><span> </span><span>=</span><span> </span></span><span>intersect</span><span>(</span><span>quad1</span><span>.</span><span>topLeft</span><span>, </span><span>quad2</span><span>.</span><span>topLeft</span><span>);</span></div></div><div><div><div>35</div></div><div><span>        </span><span>quad1</span><span>.</span><span>topRight</span><span><span> </span><span>=</span><span> </span></span><span>intersect</span><span>(</span><span>quad1</span><span>.</span><span>topRight</span><span>, </span><span>quad2</span><span>.</span><span>topRight</span><span>);</span></div></div><div><div><div>36</div></div><div><span>        </span><span>quad1</span><span>.</span><span>bottomLeft</span><span><span> </span><span>=</span><span> </span></span><span>intersect</span><span>(</span><span>quad1</span><span>.</span><span>bottomLeft</span><span>, </span><span>quad2</span><span>.</span><span>bottomLeft</span><span>);</span></div></div><div><div><div>37</div></div><div><span>        </span><span>quad1</span><span>.</span><span>bottomRight</span><span><span> </span><span>=</span><span> </span></span><span>intersect</span><span>(</span><span>quad1</span><span>.</span><span>bottomRight</span><span>, </span><span>quad2</span><span>.</span><span>bottomRight</span><span>);</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>// current node is leaf, all 4 children should be null</span></div></div><div><div><div>40</div></div><div><span>        </span><span>if</span><span> (</span><span>quad1</span><span>.</span><span>topLeft</span><span>.</span><span>isLeaf</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>quad1</span><span>.</span><span>topRight</span><span>.</span><span>isLeaf</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>&amp;&amp;</span><span> </span><span>quad1</span><span>.</span><span>bottomLeft</span><span>.</span><span>isLeaf</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>quad1</span><span>.</span><span>bottomRight</span><span>.</span><span>isLeaf</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>&amp;&amp;</span><span> </span><span>quad1</span><span>.</span><span>topLeft</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> </span></span><span>quad1</span><span>.</span><span>topRight</span><span>.</span><span>val</span></div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>&amp;&amp;</span><span> </span><span>quad1</span><span>.</span><span>topRight</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> </span></span><span>quad1</span><span>.</span><span>bottomLeft</span><span>.</span><span>val</span></div></div><div><div><div>44</div></div><div><span><span>            </span></span><span>&amp;&amp;</span><span> </span><span>quad1</span><span>.</span><span>bottomLeft</span><span>.</span><span>val</span><span><span> </span><span>==</span><span> </span></span><span>quad1</span><span>.</span><span>bottomRight</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>            </span><span>quad1</span><span>.</span><span>isLeaf</span><span><span> </span><span>=</span><span> </span></span><span>true</span><span>;</span></div></div><div><div><div>47</div></div><div><span>            </span><span>quad1</span><span>.</span><span>val</span><span><span> </span><span>=</span><span> </span></span><span>quad1</span><span>.</span><span>topLeft</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>            </span><span>quad1</span><span>.</span><span>topLeft</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>50</div></div><div><span>            </span><span>quad1</span><span>.</span><span>topRight</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>51</div></div><div><span>            </span><span>quad1</span><span>.</span><span>bottomLeft</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>52</div></div><div><span>            </span><span>quad1</span><span>.</span><span>bottomRight</span><span><span> </span><span>=</span><span> </span></span><span>null</span><span>;</span></div></div><div><div><div>53</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>54</div></div><div>
</div></div><div><div><div>55</div></div><div><span>        </span><span>return</span><span> quad1;</span></div></div><div><div><div>56</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>57</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>559. Maximum Depth of N-ary Tree<a href="#559-maximum-depth-of-n-ary-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/maximum-depth-of-n-ary-tree/" target="_blank">https://leetcode.com/problems/maximum-depth-of-n-ary-tree/</a></p><hr /><p>遍历所有子节点，每个子节点的子树上递归找出最大深度，汇总起来找到最大值。最后<code>root</code>节点本身也要使得深度+1。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public List&lt;Node&gt; children;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node() {}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>public Node(int _val) {</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>public Node(int _val, List&lt;Node&gt; _children) {</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>children = _children;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>};</span></div></div><div><div><div>18</div></div><div><span>*/</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>21</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxDepth</span><span>(</span><span>Node</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>27</div></div><div><span>        </span><span>for</span><span> (</span><span>Node</span><span><span> </span><span>child</span><span> </span></span><span>:</span><span> </span><span>root</span><span>.</span><span>children</span><span>) {</span></div></div><div><div><div>28</div></div><div><span>            </span><span>int</span><span><span> </span><span>currentTreeDepth</span><span> </span></span><span><span>=</span><span> </span></span><span>maxDepth</span><span>(child);</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, currentTreeDepth);</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>// add 1 as the height of root</span></div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span><span> result </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>560. Subarray Sum Equals K<a href="#560-subarray-sum-equals-k"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/subarray-sum-equals-k/" target="_blank">https://leetcode.com/problems/subarray-sum-equals-k/</a></p><hr /><p>用一个数组<code>sum</code>，保存截止到任意下标<code>i</code>时，<code>nums[0]</code>到<code>nums[i]</code>之间所有元素的和；再用一个map存储每一个pre sum分别在<code>nums</code>中出现了多少次。</p><p>因为我们可以很容易的获得<code>sum[i]</code>出现的次数，所以如果要求出值为<code>k</code>的pre sum出现了几次，我们只需要在map中查找值为<code>sum[i] - k</code>的pre sum出现的次数，对减即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>subarraySum</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>k</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// &lt;sum, freq&gt;</span></div></div><div><div><div>6</div></div><div><span>        </span><span>HashMap</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>7</div></div><div><span>        </span><span>map</span><span>.</span><span>put</span><span>(</span><span>0</span><span>, </span><span>1</span><span>);</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// pre sum array</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>nums</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>sum[</span><span>0</span><span><span>] </span><span>=</span><span> nums[</span></span><span>0</span><span>];</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>sum[i] </span><span>=</span><span> sum[i</span><span>-</span><span>1</span><span><span>] </span><span>+</span><span> nums[i];</span></span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>sum</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>// if we know SUM[0, i - 1] and SUM[0, j], we get SUM[i, j]</span></div></div><div><div><div>18</div></div><div><span>            </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span><span>(sum[i] </span><span>-</span><span> k)) {</span></span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>result </span><span>+=</span><span> </span><span>map</span><span>.</span><span>get</span><span><span>(sum[i] </span><span>-</span><span> k);</span></span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>            </span><span>// add current pre sum to map</span></div></div><div><div><div>23</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(sum[i], </span><span>map</span><span>.</span><span>getOrDefault</span><span>(sum[i], </span><span>0</span><span><span>) </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>561. Array Partition<a href="#561-array-partition"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/array-partition/" target="_blank">https://leetcode.com/problems/array-partition/</a></p><hr /><p>排序数组，然后相邻每两个数取较小的那个进行累加。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>arrayPairSum</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(nums);</span></div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span><span>; i </span><span>+=</span><span> </span></span><span>2</span><span>) {</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>result </span><span>+=</span><span> nums[i];</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>562. Longest Line of Consecutive One in Matrix<a href="#562-longest-line-of-consecutive-one-in-matrix"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-line-of-consecutive-one-in-matrix/" target="_blank">https://leetcode.com/problems/longest-line-of-consecutive-one-in-matrix/</a></p><hr /><p>用4个数组分别储存每条水平、竖直、对角线和反对角线上的所有1的数量，两重循环遍历时遇到一个1就更新一次这四个数组的值，然后更新最大值。</p><p>注意，此题的技巧在于对角线与反对角线数组的表达，可以让这两个数组的长度都是矩阵长 + 宽 - 1，这样就能够方便地直接用矩阵横纵坐标定位对角线位置。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>longestLine</span><span>(</span><span>int</span><span><span>[][] </span><span>M</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (M </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>M</span><span>.</span><span>length</span><span><span> </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>        </span><span>int</span><span><span> </span><span>m</span><span> </span></span><span><span>=</span><span> </span></span><span>M</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>M</span><span>[</span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>row</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[m];</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>col</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>diag</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[m</span><span>+</span><span>n</span><span>-</span></span><span>1</span><span>];</span></div></div><div><div><div>11</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>anti</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[m</span><span>+</span><span>n</span><span>-</span></span><span>1</span><span>];</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>14</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> m; i++) {</span></span></div></div><div><div><div>15</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> n; j++) {</span></span></div></div><div><div><div>16</div></div><div><span>                </span><span>if</span><span> (</span><span>M</span><span><span>[i][j] </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>17</div></div><div><span><span>                    </span></span><span>result </span><span>=</span><span> </span><span>max</span><span><span>(result, ++row[i], ++col[j], ++diag[i</span><span>-</span><span>j</span><span>+</span><span>n</span><span>-</span></span><span>1</span><span><span>], ++anti[i</span><span>+</span><span>j]);</span></span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>19</div></div><div><span><span>                    </span></span><span>row[i] </span><span>=</span><span> col[j] </span><span>=</span><span> diag[i</span><span>-</span><span>j</span><span>+</span><span>n</span><span>-</span><span>1</span><span><span>] </span><span>=</span><span> anti[i</span><span>+</span><span>j] </span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>max</span><span>(</span><span>int</span><span><span> </span><span>a</span><span>, </span></span><span>int</span><span><span> </span><span>b</span><span>, </span></span><span>int</span><span><span> </span><span>c</span><span>, </span></span><span>int</span><span><span> </span><span>d</span><span>, </span></span><span>int</span><span><span> </span><span>e</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(a, </span><span>Math</span><span>.</span><span>max</span><span>(b, </span><span>Math</span><span>.</span><span>max</span><span>(c, </span><span>Math</span><span>.</span><span>max</span><span>(d, e))));</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>563. Binary Tree Tilt<a href="#563-binary-tree-tilt"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/binary-tree-tilt/" target="_blank">https://leetcode.com/problems/binary-tree-tilt/</a></p><hr /><p>使用后序遍历，算出左右子树的总和绝对值之差。在上层父节点看来，下层孩子节点变成了子节点本身 + 孩子的左右子树之和。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> result </span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findTilt</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>postOrder</span><span>(root);</span></div></div><div><div><div>21</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>postOrder</span><span>(</span><span>TreeNode</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>postOrder</span><span>(</span><span>root</span><span>.</span><span>left</span><span>);</span></div></div><div><div><div>30</div></div><div><span>        </span><span>int</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>postOrder</span><span>(</span><span>root</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>result </span><span>+=</span><span> </span><span>Math</span><span>.</span><span>abs</span><span><span>(left </span><span>-</span><span> right);</span></span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span><span> left </span><span>+</span><span> right </span><span>+</span><span> </span></span><span>root</span><span>.</span><span>val</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>564. Find the Closest Palindrome<a href="#564-find-the-closest-palindrome"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-the-closest-palindrome/" target="_blank">https://leetcode.com/problems/find-the-closest-palindrome/</a></p><hr /><p>利用输入的<code>input</code>字符串构造回文串，把后面的字符和前面的字符配对，得到了一个当前的回文数。然后再分别向前、后两个方向搜索最近回文数，比较这三个哪一个最近。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>nearestPalindromic</span><span>(</span><span>String</span><span><span> </span><span>n</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>arr</span><span> </span></span><span><span>=</span><span> </span></span><span>n</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, j </span><span>=</span><span> </span></span><span>arr</span><span>.</span><span>length</span><span><span> </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> j; i++, j--) {</span></span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>arr[j] </span><span>=</span><span> arr[i];</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>String</span><span><span> </span><span>curP</span><span> </span></span><span><span>=</span><span> </span></span><span>String</span><span>.</span><span>valueOf</span><span>(arr);</span></div></div><div><div><div>9</div></div><div><span>        </span><span>String</span><span><span> </span><span>preP</span><span> </span></span><span><span>=</span><span> </span></span><span>nearestPalindrom</span><span>(curP, </span><span>false</span><span>);</span></div></div><div><div><div>10</div></div><div><span>        </span><span>String</span><span><span> </span><span>nextP</span><span> </span></span><span><span>=</span><span> </span></span><span>nearestPalindrom</span><span>(curP, </span><span>true</span><span>);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>long</span><span><span> </span><span>num</span><span> </span></span><span><span>=</span><span> </span></span><span>Long</span><span>.</span><span>valueOf</span><span>(n);</span></div></div><div><div><div>13</div></div><div><span>        </span><span>long</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>Long</span><span>.</span><span>valueOf</span><span>(curP);</span></div></div><div><div><div>14</div></div><div><span>        </span><span>long</span><span><span> </span><span>pre</span><span> </span></span><span><span>=</span><span> </span></span><span>Long</span><span>.</span><span>valueOf</span><span>(preP);</span></div></div><div><div><div>15</div></div><div><span>        </span><span>long</span><span><span> </span><span>next</span><span> </span></span><span><span>=</span><span> </span></span><span>Long</span><span>.</span><span>valueOf</span><span>(nextP);</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>long</span><span><span> </span><span>d1</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(num </span><span>-</span><span> pre);</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>long</span><span><span> </span><span>d2</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(num </span><span>-</span><span> cur);</span></span></div></div><div><div><div>19</div></div><div><span>        </span><span>long</span><span><span> </span><span>d3</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span><span>(num </span><span>-</span><span> next);</span></span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>if</span><span><span> (num </span><span>==</span><span> cur) {</span></span></div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span><span> d1 </span><span>&lt;=</span><span> d3 </span></span><span>?</span><span> preP </span><span>:</span><span> nextP;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (num </span><span>&gt;</span><span> cur) {</span></span></div></div><div><div><div>24</div></div><div><span>            </span><span>return</span><span><span> d2 </span><span>&lt;=</span><span> d3 </span></span><span>?</span><span> curP </span><span>:</span><span> nextP;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span><span> d1 </span><span>&lt;=</span><span> d2 </span></span><span>?</span><span> preP </span><span>:</span><span> curP;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>    </span><span>private</span><span> </span><span>String</span><span> </span><span>nearestPalindrom</span><span>(</span><span>String</span><span><span> </span><span>curP</span><span>, </span></span><span>boolean</span><span><span> </span><span>dir</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>31</div></div><div><span>        </span><span>int</span><span><span> </span><span>k</span><span> </span></span><span><span>=</span><span> </span></span><span>curP</span><span>.</span><span>length</span><span><span>() </span><span>&gt;&gt;</span><span> </span></span><span>1</span><span><span>, p </span><span>=</span><span> </span></span><span>curP</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> k;</span></span></div></div><div><div><div>32</div></div><div><span>        </span><span>int</span><span><span> </span><span>l</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>valueOf</span><span>(</span><span>curP</span><span>.</span><span>substring</span><span>(</span><span>0</span><span>, p));</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>l </span><span>+=</span><span> (dir </span><span>?</span><span> </span><span>1</span><span> </span><span>:</span><span><span> </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>        </span><span>if</span><span><span> (l </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>36</div></div><div><span>            </span><span>return</span><span><span> k </span><span>==</span><span> </span></span><span>0</span><span> </span><span>?</span><span> </span><span>"0"</span><span> </span><span>:</span><span> </span><span>"9"</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>(</span><span>String</span><span>.</span><span>valueOf</span><span>(l));</span></div></div><div><div><div>40</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>(left).</span><span>reverse</span><span>();</span></div></div><div><div><div>41</div></div><div><span>        </span><span>if</span><span><span> (k </span><span>&gt;</span><span> </span></span><span>left</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>42</div></div><div><span>            </span><span>right</span><span>.</span><span>append</span><span>(</span><span>"9"</span><span>);</span></div></div><div><div><div>43</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span>        </span><span>return</span><span> </span><span>left</span><span>.</span><span>append</span><span>(</span><span>right</span><span>.</span><span>substring</span><span>(</span><span>right</span><span>.</span><span>length</span><span><span>() </span><span>-</span><span> k)).</span></span><span>toString</span><span>();</span></div></div><div><div><div>46</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>565. Array Nesting<a href="#565-array-nesting"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/array-nesting/" target="_blank">https://leetcode.com/problems/array-nesting/</a></p><hr /><p>用一个<code>visited</code>数组，存储全局情况下，某个数是否已经被访问过。之后遍历数组，遇到一个数<code>currentNum</code>就继续找<code>nums[currentNum]</code>，以此类推不断循环，直到遇到了重复的数字。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>arrayNesting</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>boolean</span><span><span>[] </span><span>visited</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>boolean</span><span>[</span><span>nums</span><span>.</span><span>length</span><span>];</span></div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>currentNum</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>7</div></div><div><span>            </span><span>int</span><span><span> </span><span>currentLength</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>            </span><span>while</span><span><span> (</span><span>!</span><span>visited[currentNum]) {</span></span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>visited[currentNum] </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>currentLength++;</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>currentNum </span><span>=</span><span> nums[currentNum];</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, currentLength);</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>566. Reshape the Matrix<a href="#566-reshape-the-matrix"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/reshape-the-matrix/" target="_blank">https://leetcode.com/problems/reshape-the-matrix/</a></p><hr /><p>把二维数组看成是一个长度为r * c的一维数组，行和列分别用除宽和模宽获得。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[][] </span><span>matrixReshape</span><span>(</span><span>int</span><span><span>[][] </span><span>nums</span><span>, </span></span><span>int</span><span><span> </span><span>r</span><span>, </span></span><span>int</span><span><span> </span><span>c</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>originR</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>originC</span><span> </span></span><span><span>=</span><span> nums[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span><span> ((originR </span><span>==</span><span> r </span><span>&amp;&amp;</span><span> originC </span><span>==</span><span> c) </span><span>||</span><span> (originR </span><span>*</span><span> originC </span><span>!=</span><span> r </span><span>*</span><span> c)) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>return</span><span> nums;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[r][c];</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> r </span><span>*</span><span> c; i++) {</span></span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>result[i </span><span>/</span><span> c][i </span><span>%</span><span> c] </span><span>=</span><span> nums[i </span><span>/</span><span> originC][i </span><span>%</span><span> originC];</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>567. Permutation in String<a href="#567-permutation-in-string"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/permutation-in-string/" target="_blank">https://leetcode.com/problems/permutation-in-string/</a></p><hr /><p>用滑动窗口，先用map统计<code>s1</code>中每个字母使用了几次，之后遍历<code>s2</code>，一个字母进入窗口就从map中扣去这个字母剩余的数量，一个字母退出窗口就让map加回此前扣除的数量。再使用一个变量，统计目前map中几个字母剩余数量不为0，如果所有字母剩余数量都是0则符合题意。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>checkInclusion</span><span>(</span><span>String</span><span><span> </span><span>s1</span><span>, </span></span><span>String</span><span><span> </span><span>s2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>s1</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>s2</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span>[] </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[</span><span>128</span><span>];</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>nonZeroCount</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>char</span><span><span> </span><span>c</span><span> </span></span><span>:</span><span> </span><span>s1</span><span>.</span><span>toCharArray</span><span>()) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>if</span><span><span> (map[c] </span><span>==</span><span> </span></span><span>0</span><span>) nonZeroCount++;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>map[c]++;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>int</span><span><span> </span><span>s1Len</span><span> </span></span><span><span>=</span><span> </span></span><span>s1</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>15</div></div><div><span>        </span><span>char</span><span><span>[] </span><span>s2CharArray</span><span> </span></span><span><span>=</span><span> </span></span><span>s2</span><span>.</span><span>toCharArray</span><span>();</span></div></div><div><div><div>16</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>s2CharArray</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>17</div></div><div><span>            </span><span>// add a new character to sliding window</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>map[ s2CharArray[i] ]--;</span></div></div><div><div><div>19</div></div><div><span>            </span><span>if</span><span><span> (map[ s2CharArray[i] ] </span><span>==</span><span> </span><span>-</span></span><span>1</span><span>) {</span></div></div><div><div><div>20</div></div><div><span><span>                </span></span><span>nonZeroCount++;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>            </span><span>if</span><span><span> (map[ s2CharArray[i] ] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>nonZeroCount--;</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>            </span><span>// remove an old character from sliding window</span></div></div><div><div><div>27</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>&gt;=</span><span> s1Len) {</span></span></div></div><div><div><div>28</div></div><div><span><span>                </span></span><span>map[ s2CharArray[i </span><span>-</span><span> s1Len] ]++;</span></div></div><div><div><div>29</div></div><div><span>                </span><span>if</span><span><span> (map[ s2CharArray[i </span><span>-</span><span> s1Len] ] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>30</div></div><div><span><span>                    </span></span><span>nonZeroCount--;</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span>                </span><span>if</span><span><span> (map[ s2CharArray[i </span><span>-</span><span> s1Len] ] </span><span>==</span><span> </span></span><span>1</span><span>) {</span></div></div><div><div><div>33</div></div><div><span><span>                    </span></span><span>nonZeroCount++;</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>            </span><span>if</span><span><span> (nonZeroCount </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>38</div></div><div><span>                </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>        </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>568. Maximum Vacation Days<a href="#568-maximum-vacation-days"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/maximum-vacation-days/" target="_blank">https://leetcode.com/problems/maximum-vacation-days/</a></p><hr /><p>每一周我们可以选择留在这个城市，这样总的休息天数就是当前这周在当前城市的休假天数 + 之后的休假天数；或者我们可以选择这周飞去其他城市，总的休息天数就变成了其他城市休假天数 + 之后的休假天数。比较取最大值。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> numCities</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> numWeeks</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[][] flights</span><span>;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span>[][] days</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxVacationDays</span><span>(</span><span>int</span><span><span>[][] </span><span>flights</span><span>, </span></span><span>int</span><span><span>[][] </span><span>days</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>8</div></div><div><span>        </span><span>this</span><span>.</span><span>numCities</span><span><span> </span><span>=</span><span> </span></span><span>flights</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>this</span><span>.</span><span>numWeeks</span><span><span> </span><span>=</span><span> days[</span></span><span>0</span><span>].</span><span>length</span><span>;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>this</span><span>.</span><span>flights</span><span><span> </span><span>=</span><span> flights;</span></span></div></div><div><div><div>11</div></div><div><span>        </span><span>this</span><span>.</span><span>days</span><span><span> </span><span>=</span><span> days;</span></span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>memo</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[numCities][numWeeks];</span></div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> </span><span>dfs</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, memo);</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>dfs</span><span>(</span><span>int</span><span><span> </span><span>curCity</span><span>, </span></span><span>int</span><span><span> </span><span>curWeek</span><span>, </span></span><span>int</span><span><span>[][] </span><span>memo</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (curWeek </span><span>==</span><span> numWeeks) {</span></span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>if</span><span><span> (memo[curCity][curWeek] </span><span>!=</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>return</span><span> memo[curCity][curWeek];</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>// Stay in current city for this week</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, days[curCity][curWeek] </span><span>+</span><span> </span></span><span>dfs</span><span><span>(curCity, curWeek </span><span>+</span><span> </span></span><span>1</span><span>, memo));</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>        </span><span>// Fly to other city to stay for this week</span></div></div><div><div><div>32</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> numCities; i++) {</span></span></div></div><div><div><div>33</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>==</span><span> curCity </span><span>||</span><span> flights[curCity][i] </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>34</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(result, days[i][curWeek] </span><span>+</span><span> </span></span><span>dfs</span><span><span>(i, curWeek</span><span>+</span></span><span>1</span><span>, memo));</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>memo[curCity][curWeek] </span><span>=</span><span> result;</span></div></div><div><div><div>40</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>569. Median Employee Salary<a href="#569-median-employee-salary"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/median-employee-salary/" target="_blank">https://leetcode.com/problems/median-employee-salary/</a></p><hr /><p>运用PARTITION BY语句，把所有公司分割开，然后在公司内部按照工资排序得到每个公司的排名表，再计算出总的公司的人数，这样就汇总得到了一份所有公司的人数+排名信息。从这个信息里，抽出每个公司里排名可能在中位数上的人。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>WITH</span><span> ranking_table </span><span>AS</span><span> (</span></div></div><div><div><div>2</div></div><div><span>    </span><span>SELECT</span><span> *,</span></div></div><div><div><div>3</div></div><div><span>       </span><span>row_number</span><span>() </span><span>over</span><span>(</span><span>PARTITION</span><span> </span><span>BY</span><span> Company </span><span>ORDER BY</span><span> Salary) </span><span>AS</span><span> company_rank,</span></div></div><div><div><div>4</div></div><div><span>       </span><span>COUNT</span><span>(Id) </span><span>over</span><span>(</span><span>PARTITION</span><span> </span><span>BY</span><span> Company) </span><span>AS</span><span> company_total</span></div></div><div><div><div>5</div></div><div><span>    </span><span>FROM</span><span> Employee</span></div></div><div><div><div>6</div></div><div><span>)</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>SELECT</span><span> Id, Company, Salary</span></div></div><div><div><div>9</div></div><div><span>FROM</span><span> ranking_table</span></div></div><div><div><div>10</div></div><div><span>WHERE</span><span> company_rank </span><span>BETWEEN</span><span> company_total / </span><span>2</span><span> </span><span>AND</span><span> company_total / </span><span>2</span><span> + </span><span>1</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>570. Managers with at Least 5 Direct Reports<a href="#570-managers-with-at-least-5-direct-reports"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/managers-with-at-least-5-direct-reports/" target="_blank">https://leetcode.com/problems/managers-with-at-least-5-direct-reports/</a></p><hr /><p>直接从<code>ManagerId</code>列表里，找到出现5次以上的编号。注意Having语句是需要搭配Group By一起使用的。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>NAME</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Employee</span></div></div><div><div><div>3</div></div><div><span>WHERE</span><span> Id </span><span>IN</span><span> (</span></div></div><div><div><div>4</div></div><div><span>    </span><span>SELECT</span><span> ManagerId</span></div></div><div><div><div>5</div></div><div><span>    </span><span>FROM</span><span> Employee</span></div></div><div><div><div>6</div></div><div><span>    </span><span>GROUP BY</span><span> ManagerId</span></div></div><div><div><div>7</div></div><div><span>    </span><span>HAVING</span><span> </span><span>COUNT</span><span><span>(ManagerId) </span><span>&gt;=</span><span> </span></span><span>5</span></div></div><div><div><div>8</div></div><div><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>571. Find Median Given Frequency of Numbers<a href="#571-find-median-given-frequency-of-numbers"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-median-given-frequency-of-numbers/" target="_blank">https://leetcode.com/problems/find-median-given-frequency-of-numbers/</a></p><hr /><p>假设一个数<code>x</code>的出现的频率为<code>n</code>，并且在<code>x</code>左侧的数总频率为<code>l</code>，在<code>x</code>右侧的数总频率为<code>r</code>，之后分别对小于等于<code>x</code>以及大于等于<code>x</code>的数做筛选，那么这两段数字的长度分别是<code>n + l</code>和<code>n + r</code>，两段长度对减就<code>是l - r</code>。很显然，如果<code>l = r</code>，就说明<code>x</code>正好是中位数；而即便<code>l ≠ r</code>，只要<code>n</code>足够大且能够覆盖<code>l</code>和<code>r</code>的差值，那也能说明<code>x</code>就是中位数。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>AVG</span><span>(</span><span>n</span><span>.</span><span>num</span><span>) median</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Numbers n</span></div></div><div><div><div>3</div></div><div><span>WHERE</span><span> </span><span>n</span><span>.</span><span>frequency</span><span><span> </span><span>&gt;=</span><span> </span></span><span>abs</span><span>((</span><span>SELECT</span><span> </span><span>SUM</span><span>(Frequency)</span></div></div><div><div><div>4</div></div><div><span>                          </span><span>FROM</span><span> Numbers</span></div></div><div><div><div>5</div></div><div><span>                          </span><span>WHERE</span><span><span> num </span><span>&lt;=</span><span> </span></span><span>n</span><span>.</span><span>num</span><span>) -</span></div></div><div><div><div>6</div></div><div><span><span>                         </span></span><span>(</span><span>SELECT</span><span> </span><span>SUM</span><span>(Frequency)</span></div></div><div><div><div>7</div></div><div><span>                          </span><span>FROM</span><span> Numbers</span></div></div><div><div><div>8</div></div><div><span>                          </span><span>WHERE</span><span><span> num </span><span>&gt;=</span><span> </span></span><span>n</span><span>.</span><span>num</span><span>))</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>572. Subtree of Another Tree<a href="#572-subtree-of-another-tree"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/subtree-of-another-tree/" target="_blank">https://leetcode.com/problems/subtree-of-another-tree/</a></p><hr /><p>判断两个树是否相等，之后再进行树的遍历。需要注意<code>subtree</code>为<code>tree</code>的子树可能有三种情况：完全相等、存在于左子树中、存在于右子树中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* Definition for a binary tree node.</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* public class TreeNode {</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>*     int val;</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*     TreeNode left;</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>*     TreeNode right;</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*     TreeNode() {}</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*     TreeNode(int val) { this.val = val; }</span></div></div><div><div><div>9</div></div><div><span><span> </span></span><span>*     TreeNode(int val, TreeNode left, TreeNode right) {</span></div></div><div><div><div>10</div></div><div><span><span> </span></span><span>*         this.val = val;</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>*         this.left = left;</span></div></div><div><div><div>12</div></div><div><span><span> </span></span><span>*         this.right = right;</span></div></div><div><div><div>13</div></div><div><span><span> </span></span><span>*     }</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>* }</span></div></div><div><div><div>15</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>16</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>private</span><span> </span><span>boolean</span><span> </span><span>isSameTree</span><span>(</span><span>TreeNode</span><span><span> </span><span>tree</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>subtree</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span><span> (tree </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> subtree </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>19</div></div><div><span>            </span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>        </span><span>if</span><span><span> (tree </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> subtree </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>if</span><span> (</span><span>tree</span><span>.</span><span>val</span><span><span> </span><span>!=</span><span> </span></span><span>subtree</span><span>.</span><span>val</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>return</span><span> </span><span>isSameTree</span><span>(</span><span>tree</span><span>.</span><span>left</span><span>, </span><span>subtree</span><span>.</span><span>left</span><span><span>) </span><span>&amp;&amp;</span><span> </span></span><span>isSameTree</span><span>(</span><span>tree</span><span>.</span><span>right</span><span>, </span><span>subtree</span><span>.</span><span>right</span><span>);</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isSubtree</span><span>(</span><span>TreeNode</span><span><span> </span><span>s</span><span>, </span></span><span>TreeNode</span><span><span> </span><span>t</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>33</div></div><div><span>        </span><span>if</span><span><span> (s </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>34</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span>        </span><span>return</span><span> </span><span>isSameTree</span><span><span>(s, t) </span><span>||</span><span> </span></span><span>isSubtree</span><span>(</span><span>s</span><span>.</span><span>left</span><span><span>, t) </span><span>||</span><span> </span></span><span>isSubtree</span><span>(</span><span>s</span><span>.</span><span>right</span><span>, t);</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>573. Squirrel Simulation<a href="#573-squirrel-simulation"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/squirrel-simulation/" target="_blank">https://leetcode.com/problems/squirrel-simulation/</a></p><hr /><p>假设松鼠起始位置就在树下，那么总距离就是树到每个坚果的距离之和 * 2（来回）。但由于松鼠起始的位置可能不在树下，因此我们需要把原本*2中的一段进行替换，即从“树到坚果的距离”替换成“松鼠起始位置到坚果的距离”。显然，我们需要找到一个坚果，使得树、坚果的曼哈顿距离与松鼠、坚果的曼哈顿距离之差尽可能大。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minDistance</span><span>(</span><span>int</span><span><span> </span><span>height</span><span>, </span></span><span>int</span><span><span> </span><span>width</span><span>, </span></span><span>int</span><span><span>[] </span><span>tree</span><span>, </span></span><span>int</span><span><span>[] </span><span>squirrel</span><span>, </span></span><span>int</span><span><span>[][] </span><span>nuts</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>sum</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>, maxDiff </span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MIN_VALUE</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>nut</span><span> </span></span><span>:</span><span> nuts) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>// if the squirrel starts at the tree, the minimum total distance is 2 * total Manhattan distance</span></div></div><div><div><div>7</div></div><div><span>            </span><span>int</span><span><span> </span><span>dist</span><span> </span></span><span><span>=</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span>(tree[</span><span>0</span><span><span>] </span><span>-</span><span> nut[</span></span><span>0</span><span><span>]) </span><span>+</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span>(tree[</span><span>1</span><span><span>] </span><span>-</span><span> nut[</span></span><span>1</span><span>]);</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>sum </span><span>+=</span><span> </span><span>2</span><span><span>*</span><span>dist;</span></span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>            </span><span>// since the squirrel starts elsewhere, substitute distance from (tree -&gt; nut) to (squirrel -&gt; nut) to minimize sum - maxDiff</span></div></div><div><div><div>11</div></div><div><span>            </span><span>// we shall find the nuts position that maximizes maxDiff</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>maxDiff </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(maxDiff, dist </span><span>-</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span>(squirrel[</span><span>0</span><span><span>] </span><span>-</span><span> nut[</span></span><span>0</span><span><span>]) </span><span>-</span><span> </span></span><span>Math</span><span>.</span><span>abs</span><span>(squirrel[</span><span>1</span><span><span>] </span><span>-</span><span> nut[</span></span><span>1</span><span>]));</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>        </span><span>return</span><span><span> sum </span><span>-</span><span> maxDiff;</span></span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>574. Winning Candidate<a href="#574-winning-candidate"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/winning-candidate/" target="_blank">https://leetcode.com/problems/winning-candidate/</a></p><hr /><p>根据<code>Vote</code>表中的<code>CandidateId</code>做排序，Group By之后按照<code>CandidateId</code>出现的数量从高到低排序，选择第一个。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>Name</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Candidate</span></div></div><div><div><div>3</div></div><div><span>WHERE</span><span><span> id </span><span>=</span><span> (</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>SELECT</span><span> CandidateId</span></div></div><div><div><div>5</div></div><div><span>    </span><span>FROM</span><span> Vote</span></div></div><div><div><div>6</div></div><div><span>    </span><span>GROUP BY</span><span> CandidateId</span></div></div><div><div><div>7</div></div><div><span>    </span><span>ORDER BY</span><span> </span><span>COUNT</span><span>(id)</span></div></div><div><div><div>8</div></div><div><span>    </span><span>DESC</span><span> </span><span>LIMIT</span><span> </span><span>1</span></div></div><div><div><div>9</div></div><div><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>575. Distribute Candies<a href="#575-distribute-candies"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/distribute-candies/" target="_blank">https://leetcode.com/problems/distribute-candies/</a></p><hr /><p>使用一个Set，统计出现过的不同<code>candyType</code>数量，实际能吃的数量上限是<code>n/</code>2。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>distributeCandies</span><span>(</span><span>int</span><span><span>[] </span><span>candyType</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>Set</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>set</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>type</span><span> </span></span><span>:</span><span> candyType) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>set</span><span>.</span><span>add</span><span>(type);</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>        </span><span>return</span><span> </span><span>set</span><span>.</span><span>size</span><span><span>() </span><span>&gt;</span><span> </span></span><span>candyType</span><span>.</span><span>length</span><span><span> </span><span>/</span><span> </span></span><span>2</span><span> </span><span>?</span><span> </span><span>candyType</span><span>.</span><span>length</span><span><span> </span><span>/</span><span> </span></span><span>2</span><span> </span><span>:</span><span> </span><span>set</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>576. Out of Boundary Paths<a href="#576-out-of-boundary-paths"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/out-of-boundary-paths/" target="_blank">https://leetcode.com/problems/out-of-boundary-paths/</a></p><hr /><p>用一个三位数组<code>dp</code>存储状态，<code>dp[i][j][move]</code>表示从起点出发，经过<code>move</code>步到达<code>(i, j)</code>共有几条路径。可以进行分类讨论：</p><ul>
<li>如果走出界了，只有1种方法走回去，即原地掉头返回矩阵</li>
<li>如果已经用完了步数，无法继续行动，返回0</li>
<li>如果<code>dp</code>中的状态已经有计算好的了，直接返回</li>
<li>其他时候，用BFS遍历四个方向，更新<code>dp</code>，注意取模</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> M </span><span><span>=</span><span> </span></span><span>1000000007</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findPaths</span><span>(</span><span>int</span><span><span> </span><span>m</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span> </span><span>maxMove</span><span>, </span></span><span>int</span><span><span> </span><span>startRow</span><span>, </span></span><span>int</span><span><span> </span><span>startColumn</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>5</div></div><div><span>        </span><span>if</span><span><span> (maxMove </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> startRow </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> startRow </span><span>&gt;=</span><span> m </span><span>||</span><span> startColumn </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> startColumn </span><span>&gt;=</span><span> n) {</span></span></div></div><div><div><div>6</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>// how many possible ways to walk into cell[i][j] in step move</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span>[][][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[m][n][maxMove </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span>[][] </span><span>matrix</span><span> </span></span><span>:</span><span> dp) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span>[] </span><span>arr</span><span> </span></span><span>:</span><span> matrix) {</span></div></div><div><div><div>13</div></div><div><span>                </span><span>Arrays</span><span>.</span><span>fill</span><span><span>(arr, </span><span>-</span></span><span>1</span><span>);</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> </span><span>updateDP</span><span>(m, n, maxMove, startRow, startColumn, </span><span>0</span><span>, dp);</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>updateDP</span><span>(</span><span>int</span><span><span> </span><span>m</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span> </span><span>N</span><span>, </span></span><span>int</span><span><span> </span><span>i</span><span>, </span></span><span>int</span><span><span> </span><span>j</span><span>, </span></span><span>int</span><span><span> </span><span>move</span><span>, </span></span><span>int</span><span><span>[][][] </span><span>dp</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>20</div></div><div><span>        </span><span>// out of bound, only way is to go back</span></div></div><div><div><div>21</div></div><div><span>        </span><span>if</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> i </span><span>&gt;=</span><span> m </span><span>||</span><span> j </span><span>&lt;</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> j </span><span>&gt;=</span><span> n) {</span></span></div></div><div><div><div>22</div></div><div><span>            </span><span>return</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>// already travel N moves, stops here</span></div></div><div><div><div>26</div></div><div><span>        </span><span>if</span><span><span> (move </span><span>==</span><span> N) {</span></span></div></div><div><div><div>27</div></div><div><span>            </span><span>return</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>// already traveled, directly retrieve from previous calculation</span></div></div><div><div><div>31</div></div><div><span>        </span><span>if</span><span><span> (dp[i][j][move] </span><span>&gt;=</span><span> </span></span><span>0</span><span>) 「</span></div></div><div><div><div>32</div></div><div><span>            </span><span>return</span><span> dp[i][j][move];</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>// BFS</span></div></div><div><div><div>35</div></div><div><span>        </span><span>int</span><span><span> </span><span>left</span><span> </span></span><span><span>=</span><span> </span></span><span>updateDP</span><span><span>(m, n, N, i </span><span>-</span><span> </span></span><span>1</span><span><span>, j, move </span><span>+</span><span> </span></span><span>1</span><span>, dp);</span></div></div><div><div><div>36</div></div><div><span>        </span><span>int</span><span><span> </span><span>right</span><span> </span></span><span><span>=</span><span> </span></span><span>updateDP</span><span><span>(m, n, N, i </span><span>+</span><span> </span></span><span>1</span><span><span>, j, move </span><span>+</span><span> </span></span><span>1</span><span>, dp);</span></div></div><div><div><div>37</div></div><div><span>        </span><span>int</span><span><span> </span><span>up</span><span> </span></span><span><span>=</span><span> </span></span><span>updateDP</span><span><span>(m, n, N, i, j </span><span>-</span><span> </span></span><span>1</span><span><span>, move </span><span>+</span><span> </span></span><span>1</span><span>, dp);</span></div></div><div><div><div>38</div></div><div><span>        </span><span>int</span><span><span> </span><span>down</span><span> </span></span><span><span>=</span><span> </span></span><span>updateDP</span><span><span>(m, n, N, i, j </span><span>+</span><span> </span></span><span>1</span><span><span>, move </span><span>+</span><span> </span></span><span>1</span><span>, dp);</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>        </span><span>// update new ways</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>dp[i][j][move] </span><span>=</span><span> ( (left </span><span>+</span><span> right) </span><span>%</span><span> M </span><span>+</span><span> (up </span><span>+</span><span> down) </span><span>%</span><span> M) </span><span>%</span><span> M;</span></div></div><div><div><div>42</div></div><div><span>        </span><span>return</span><span> dp[i][j][move];</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>577. Employee Bonus<a href="#577-employee-bonus"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/employee-bonus/" target="_blank">https://leetcode.com/problems/employee-bonus/</a></p><hr /><p>做一次left join，用<code>empId</code>建立关联，然后再用Where指定条件。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>name</span><span>, bonus</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Employee </span><span>LEFT JOIN</span><span> Bonus</span></div></div><div><div><div>3</div></div><div><span>ON</span><span> </span><span>Employee</span><span>.</span><span>empId</span><span><span> </span><span>=</span><span> </span></span><span>Bonus</span><span>.</span><span>empId</span></div></div><div><div><div>4</div></div><div><span>WHERE</span><span><span> bonus </span><span>&lt;</span><span> </span></span><span>1000</span><span> </span><span>OR</span><span> bonus </span><span>is</span><span> </span><span>NULL</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>578. Get Highest Answer Rate Question<a href="#578-get-highest-answer-rate-question"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/get-highest-answer-rate-question/" target="_blank">https://leetcode.com/problems/get-highest-answer-rate-question/</a></p><hr /><p>用<code>SUM()</code>和<code>IF()</code>函数，统计出对于每个<code>question_id</code>，<code>answer</code>的次数和<code>show</code>的次数分别是多少，二者相除，降序排序后输出最大值。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> question_id survey_log</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> SurveyLog</span></div></div><div><div><div>3</div></div><div><span>GROUP BY</span><span> </span><span>1</span></div></div><div><div><div>4</div></div><div><span>ORDER BY</span><span> </span><span>SUM</span><span>(</span><span>IF</span><span>(</span><span>action</span><span>=</span><span>'answer'</span><span>, </span><span>1</span><span>, </span><span>0</span><span>)) / </span><span>SUM</span><span>(</span><span>IF</span><span>(</span><span>action</span><span>=</span><span>'show'</span><span>, </span><span>1</span><span>, </span><span>0</span><span>)) </span><span>DESC</span><span>, </span><span>1</span><span> </span><span>ASC</span></div></div><div><div><div>5</div></div><div><span>LIMIT</span><span> </span><span>1</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>579. Find Cumulative Salary of an Employee<a href="#579-find-cumulative-salary-of-an-employee"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-cumulative-salary-of-an-employee/" target="_blank">https://leetcode.com/problems/find-cumulative-salary-of-an-employee/</a></p><hr /><p>先确定月份范围（近期3个月并除去最近一个月），再归类范围内的月份并累加总工资。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> id, </span><span>month</span><span>, SUMs </span><span>AS</span><span> salary</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> (</span></div></div><div><div><div>3</div></div><div><span>    </span><span>SELECT</span><span> id, </span><span>month</span><span>, </span><span>ROW_NUMBER</span><span>() </span><span>OVER</span><span>(</span><span>PARTITION</span><span> </span><span>BY</span><span> id </span><span>ORDER BY</span><span> </span><span>month</span><span> </span><span>DESC</span><span>) </span><span>AS</span><span> rk,</span></div></div><div><div><div>4</div></div><div><span>           </span><span>SUM</span><span>(Salary) </span><span>OVER</span><span>(</span><span>PARTITION</span><span> </span><span>BY</span><span> id </span><span>ORDER BY</span><span> </span><span>month</span><span> </span><span>RANGE</span><span> </span><span>BETWEEN</span><span> </span><span>2</span><span> </span><span>PRECEDING</span><span> </span><span>AND</span><span> CURRENT </span><span>ROW</span><span>) </span><span>AS</span><span> SUMs</span></div></div><div><div><div>5</div></div><div><span>    </span><span>FROM</span><span> Employee) temp</span></div></div><div><div><div>6</div></div><div><span>WHERE</span><span><span> rk </span><span>&gt;</span><span> </span></span><span>1</span></div></div><div><div><div>7</div></div><div><span>ORDER BY</span><span> id </span><span>ASC</span><span>, </span><span>month</span><span> </span><span>DESC</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>580. Count Student Number in Departments<a href="#580-count-student-number-in-departments"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/count-student-number-in-departments/" target="_blank">https://leetcode.com/problems/count-student-number-in-departments/</a></p><hr /><p>用<code>Department</code>表和<code>Student</code>表左连接，因为有的<code>Department</code>里可能没有学生。之后再Group By用<code>Count()</code>统计出每个<code>Department</code>里的学生数量。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>d</span><span>.</span><span>dept_name</span><span>, </span><span>COUNT</span><span>(</span><span>s</span><span>.</span><span>student_id</span><span>) </span><span>AS</span><span> student_number</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> department d </span><span>LEFT JOIN</span><span> student s</span></div></div><div><div><div>3</div></div><div><span>ON</span><span> </span><span>d</span><span>.</span><span>dept_id</span><span><span> </span><span>=</span><span> </span></span><span>s</span><span>.</span><span>dept_id</span></div></div><div><div><div>4</div></div><div><span>GROUP BY</span><span> </span><span>d</span><span>.</span><span>dept_name</span></div></div><div><div><div>5</div></div><div><span>ORDER BY</span><span> student_number </span><span>DESC</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>581. Shortest Unsorted Continuous Subarray<a href="#581-shortest-unsorted-continuous-subarray"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/shortest-unsorted-continuous-subarray/" target="_blank">https://leetcode.com/problems/shortest-unsorted-continuous-subarray/</a></p><hr /><p>维护两个变量<code>max</code>和min，<code>max</code>负责从前往后搜索数组最大值，<code>min</code>负责从后往前搜索数组最小值。如果发现当前<code>nums[i]</code>比<code>max</code>更小，说明破坏了从左到右的升序规则，<code>i</code>就是排序区间的结尾；如果发现当前<code>nums[n - 1 - i]</code>比<code>min</code>更大，说明破坏了从右到左的降序规则，<code>n - 1 - i</code>就是排序区间的结尾。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findUnsortedSubarray</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>nums</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>beg</span><span> </span></span><span><span>=</span><span> </span><span>-</span></span><span>1</span><span><span>, end </span><span>=</span><span> </span><span>-</span></span><span>2</span><span><span>, min </span><span>=</span><span> nums[n</span><span>-</span></span><span>1</span><span><span>], max </span><span>=</span><span> nums[</span></span><span>0</span><span>];</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>// search max forward and search min backward</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>max </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(max, nums[i]);</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>min </span><span>=</span><span> </span><span>Math</span><span>.</span><span>min</span><span><span>(min, nums[n </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>-</span><span> i]);</span></span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>            </span><span>// find the begin and end indices that upset sorted order</span></div></div><div><div><div>12</div></div><div><span>            </span><span>if</span><span><span> (nums[i] </span><span>&lt;</span><span> max) {</span></span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>end </span><span>=</span><span> i;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>            </span><span>if</span><span><span> (nums[n </span><span>-</span><span> </span></span><span>1</span><span><span> </span><span>-</span><span> i] </span><span>&gt;</span><span> min) {</span></span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>beg </span><span>=</span><span> n </span><span>-</span><span> </span><span>1</span><span><span> </span><span>-</span><span> i;</span></span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>        </span><span>return</span><span><span> end </span><span>-</span><span> beg </span><span>+</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>582. Kill Process<a href="#582-kill-process"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/kill-process/" target="_blank">https://leetcode.com/problems/kill-process/</a></p><hr /><p>先使用一个HashMap把每个父节点以及对应的全部子节点存储起来，之后用BFS的层次遍历思想，先把<code>kill</code>加入队列，之后每次循环都提取出队列的第一个进程并终止，再把这个进程所有子节点加入队列，如此不断循环遍历直到队列为空。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>killProcess</span><span>(</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>pid</span><span>, </span></span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>ppid</span><span>, </span></span><span>int</span><span><span> </span><span>kill</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;(); </span><span>// &lt;parent process id, all children's ids&gt;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// for each parent, add all its children</span></div></div><div><div><div>7</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>pid</span><span>.</span><span>size</span><span>(); i++) {</span></div></div><div><div><div>8</div></div><div><span>            </span><span>int</span><span><span> </span><span>currentParent</span><span> </span></span><span><span>=</span><span> </span></span><span>ppid</span><span>.</span><span>get</span><span>(i);</span></div></div><div><div><div>9</div></div><div><span>            </span><span>int</span><span><span> </span><span>currentChild</span><span> </span></span><span><span>=</span><span> </span></span><span>pid</span><span>.</span><span>get</span><span>(i);</span></div></div><div><div><div>10</div></div><div><span>            </span><span>map</span><span>.</span><span>putIfAbsent</span><span>(currentParent, </span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;());</span></div></div><div><div><div>11</div></div><div><span>            </span><span>map</span><span>.</span><span>get</span><span>(currentParent).</span><span>add</span><span>(currentChild);</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>// use BFS to kill</span></div></div><div><div><div>15</div></div><div><span>        </span><span>Queue</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>queue</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayDeque</span><span>&lt;</span><span>Integer</span><span>&gt;();</span></div></div><div><div><div>16</div></div><div><span>        </span><span>queue</span><span>.</span><span>add</span><span>(kill);</span></div></div><div><div><div>17</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>queue</span><span>.</span><span>isEmpty</span><span>()) {</span></div></div><div><div><div>18</div></div><div><span>            </span><span>int</span><span><span> </span><span>size</span><span> </span></span><span><span>=</span><span> </span></span><span>queue</span><span>.</span><span>size</span><span>();</span></div></div><div><div><div>19</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> size; i++) {</span></span></div></div><div><div><div>20</div></div><div><span>                </span><span>int</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> </span></span><span>queue</span><span>.</span><span>remove</span><span>();</span></div></div><div><div><div>21</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(cur);</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>                </span><span>// add every child of current process to the queue</span></div></div><div><div><div>24</div></div><div><span>                </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>children</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>get</span><span>(cur);</span></div></div><div><div><div>25</div></div><div><span>                </span><span>if</span><span><span> (children </span><span>!=</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>26</div></div><div><span>                    </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>child</span><span> </span></span><span>:</span><span> children) {</span></div></div><div><div><div>27</div></div><div><span>                        </span><span>queue</span><span>.</span><span>add</span><span>(child);</span></div></div><div><div><div>28</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>583. Delete Operation for Two Strings<a href="#583-delete-operation-for-two-strings"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/delete-operation-for-two-strings/" target="_blank">https://leetcode.com/problems/delete-operation-for-two-strings/</a></p><hr /><p>此题实际上是求<code>word1</code>和<code>word2</code>的最长公共子串长度，总的操作次数实际上是<code>word1</code>和<code>word2</code>分别变成公共子串的步骤之和。显然，要使得这个操作次数尽量小，必须要让公共子串尽可能长。</p><p>使用二维动态规划，<code>dp[i][j]</code>表示<code>word1</code>的前i个字符与<code>word2</code>的前j个字符之间的最长公共子串长度。</p><p>对于<code>dp[i][j]</code>而言，如果<code>word1[i]</code>和<code>word2[j]</code>字符相同，那么二者的距离就只取决于<code>word1[0, i-1]</code>和<code>word2[0, j-1]</code>，因此<code>dp[i][j]</code>也只取决于<code>dp[i - 1][j - 1]</code>。而如果<code>word1[i]</code>和<code>word2[j]</code>字符不相同，那么就要进行比较，看是<code>word1[0, i-1]</code>和<code>word2[0, j]</code>的字串更长，还是<code>word1[0, i]</code>和<code>word2[0, j-1]</code>的字串更长。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>minDistance</span><span>(</span><span>String</span><span><span> </span><span>word1</span><span>, </span></span><span>String</span><span><span> </span><span>word2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>int</span><span><span> </span><span>len1</span><span> </span></span><span><span>=</span><span> </span></span><span>word1</span><span>.</span><span>length</span><span><span>(), len2 </span><span>=</span><span> </span></span><span>word2</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span>[][] </span><span>dp</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span><span>[len1 </span><span>+</span><span> </span></span><span>1</span><span><span>][len2 </span><span>+</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;=</span><span> len1; i++) {</span></span></div></div><div><div><div>7</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;=</span><span> len2; j++) {</span></span></div></div><div><div><div>8</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>==</span><span> </span></span><span>0</span><span><span> </span><span>||</span><span> j </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>9</div></div><div><span><span>                    </span></span><span>dp[i][j] </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>11</div></div><div><span><span>                    </span></span><span>dp[i][j] </span><span>=</span><span> (</span><span>word1</span><span>.</span><span>charAt</span><span><span>(i</span><span>-</span></span><span>1</span><span><span>) </span><span>==</span><span> </span></span><span>word2</span><span>.</span><span>charAt</span><span><span>(j</span><span>-</span></span><span>1</span><span>) </span><span>?</span><span><span> dp[i</span><span>-</span></span><span>1</span><span><span>][j</span><span>-</span></span><span>1</span><span><span>] </span><span>+</span><span> </span></span><span>1</span><span> </span><span>:</span><span> </span><span>Math</span><span>.</span><span>max</span><span><span>(dp[i</span><span>-</span></span><span>1</span><span><span>][j], dp[i][j</span><span>-</span></span><span>1</span><span>]));</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span><span> len1 </span><span>-</span><span> dp[len1][len2] </span><span>+</span><span> len2 </span><span>-</span><span> dp[len1][len2];</span></span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>584. Find Customer Referee<a href="#584-find-customer-referee"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/find-customer-referee/" target="_blank">https://leetcode.com/problems/find-customer-referee/</a></p><hr /><p>直接指定<code>referee_id</code>的条件即可。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>name</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> customer</span></div></div><div><div><div>3</div></div><div><span>WHERE</span><span> referee_id </span><span>IS</span><span> </span><span>NULL</span><span> </span><span>OR</span><span><span> referee_id </span><span>!=</span><span> </span></span><span>2</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>585. Investments in 2016<a href="#585-investments-in-2016"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/investments-in-2016/" target="_blank">https://leetcode.com/problems/investments-in-2016/</a></p><hr /><p>自连接，用<code>Count()</code>分别比较<code>TIV_2015</code>和经纬度，因为经纬度要求独一无二因此数量只能是1，而<code>TIV_2015</code>则要求不止一个。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>SUM</span><span>(TIV_2016) TIV_2016</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> insurance a</span></div></div><div><div><div>3</div></div><div><span>WHERE</span><span> </span><span>1</span><span><span> </span><span>=</span><span> (</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>SELECT</span><span> </span><span>COUNT</span><span>(*)</span></div></div><div><div><div>5</div></div><div><span>    </span><span>FROM</span><span> insurance b</span></div></div><div><div><div>6</div></div><div><span>    </span><span>WHERE</span><span> </span><span>a</span><span>.</span><span>LAT</span><span><span> </span><span>=</span><span> </span></span><span>b</span><span>.</span><span>LAT</span><span> </span><span>AND</span><span> </span><span>a</span><span>.</span><span>LON</span><span><span> </span><span>=</span><span> </span></span><span>b</span><span>.</span><span>LON</span></div></div><div><div><div>7</div></div><div><span>) </span><span>AND</span><span> </span><span>1</span><span><span> </span><span>&lt;</span><span> (</span></span></div></div><div><div><div>8</div></div><div><span>    </span><span>SELECT</span><span> </span><span>COUNT</span><span>(*)</span></div></div><div><div><div>9</div></div><div><span>    </span><span>FROM</span><span> insurance c</span></div></div><div><div><div>10</div></div><div><span>    </span><span>WHERE</span><span> </span><span>a</span><span>.</span><span>TIV_2015</span><span><span> </span><span>=</span><span> </span></span><span>c</span><span>.</span><span>TIV_2015</span></div></div><div><div><div>11</div></div><div><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>586. Customer Placing the Largest Number of Orders<a href="#586-customer-placing-the-largest-number-of-orders"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/customer-placing-the-largest-number-of-orders/" target="_blank">https://leetcode.com/problems/customer-placing-the-largest-number-of-orders/</a></p><hr /><p>Group By之后，直接按<code>Count(*)</code>进行降序排序。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> customer_number</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Orders</span></div></div><div><div><div>3</div></div><div><span>GROUP BY</span><span> customer_number</span></div></div><div><div><div>4</div></div><div><span>ORDER BY</span><span> </span><span>COUNT</span><span>(*) </span><span>DESC</span></div></div><div><div><div>5</div></div><div><span>LIMIT</span><span> </span><span>1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>对于follow-up，只需要根据具体的最大数量，再做一次子查询即可。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> customer_number</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> Orders</span></div></div><div><div><div>3</div></div><div><span>GROUP BY</span><span> customer_number</span></div></div><div><div><div>4</div></div><div><span>HAVING</span><span> </span><span>COUNT</span><span><span>(order_number) </span><span>=</span><span> (</span></span></div></div><div><div><div>5</div></div><div><span>  </span><span>SELECT</span><span> </span><span>COUNT</span><span>(order_number) </span><span>AS</span><span> cnt</span></div></div><div><div><div>6</div></div><div><span>  </span><span>FROM</span><span> orders</span></div></div><div><div><div>7</div></div><div><span>  </span><span>GROUP BY</span><span> customer_number</span></div></div><div><div><div>8</div></div><div><span>  </span><span>ORDER BY</span><span> cnt </span><span>DESC</span></div></div><div><div><div>9</div></div><div><span>  </span><span>LIMIT</span><span> </span><span>1</span></div></div><div><div><div>10</div></div><div><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>587. Erect the Fence<a href="#587-erect-the-fence"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/erect-the-fence/" target="_blank">https://leetcode.com/problems/erect-the-fence/</a></p><hr /><p>凸包(Convex Hull)问题。把所有坐标点按找<code>x</code>坐标从大到小排序，<code>x</code>相同则按<code>y</code>从大到小排序，这样排序的目的是之后便于指定描边的方向。之后分别进行上、下部分的描边，因为每个点已经按照坐标进行排序，所以我们希望大致沿逆时针方向进行描边，并用一个栈记录每一个经过的点。如果最近的三个点连成的两条线不能形成一个逆时针方向的转折，就把中间的点抛弃，在一次循环中该用最近的点作为中点。最后利用set除去栈中的重复元素。</p><p>这一算法的核心在于需要对所有坐标点预先进行排序，之后便可以直接按顺序单调遍历，因此时间复杂度为<code>O(nlogn)</code>；因为额外使用了stack与set，所以空间复杂度为<code>O(n)</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span>[][] </span><span>outerTrees</span><span>(</span><span>int</span><span><span>[][] </span><span>trees</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// sort the point of P by x-coor (case tie, sort by y-coor)</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Arrays</span><span>.</span><span>sort</span><span>(trees, (p, q) </span><span>-&gt;</span><span> q[</span><span>0</span><span><span>] </span><span>==</span><span> p[</span></span><span>0</span><span>] </span><span>?</span><span> q[</span><span>1</span><span><span>] </span><span>-</span><span> p[</span></span><span>1</span><span>] </span><span>:</span><span> q[</span><span>0</span><span><span>] </span><span>-</span><span> p[</span></span><span>0</span><span>]);</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// hold the vertices of upper and lower hulls</span></div></div><div><div><div>7</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>int</span><span><span>[]&gt; </span><span>hull</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;&gt;();</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>trees</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>        </span><span>// upper layer of hulls</span></div></div><div><div><div>11</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>12</div></div><div><span>            </span><span>// last two trees of Lower hulls and P[i] do not make a counter clockwise turn</span></div></div><div><div><div>13</div></div><div><span>            </span><span>while</span><span> (</span><span>hull</span><span>.</span><span>size</span><span><span>() </span><span>&gt;=</span><span> </span></span><span>2</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>orientation</span><span>(</span><span>hull</span><span>.</span><span>get</span><span>(</span><span>hull</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>2</span><span>), </span><span>hull</span><span>.</span><span>get</span><span>(</span><span>hull</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>), trees[i])) {</span></div></div><div><div><div>14</div></div><div><span>                </span><span>// remove q on (p, q, r)</span></div></div><div><div><div>15</div></div><div><span>                </span><span>hull</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>            </span><span>hull</span><span>.</span><span>push</span><span>(trees[i]);</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>        </span><span>hull</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>        </span><span>// lower layer of hulls</span></div></div><div><div><div>22</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> n </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>23</div></div><div><span>            </span><span>while</span><span> (</span><span>hull</span><span>.</span><span>size</span><span><span>() </span><span>&gt;=</span><span> </span></span><span>2</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>orientation</span><span>(</span><span>hull</span><span>.</span><span>get</span><span>(</span><span>hull</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>2</span><span>), </span><span>hull</span><span>.</span><span>get</span><span>(</span><span>hull</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span>), trees[i])) {</span></div></div><div><div><div>24</div></div><div><span>                </span><span>hull</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>            </span><span>hull</span><span>.</span><span>push</span><span>(trees[i]);</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>        </span><span>// remove redundant elements from the stack</span></div></div><div><div><div>30</div></div><div><span>        </span><span>HashSet</span><span>&lt;</span><span>int</span><span><span>[]&gt; </span><span>set</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;(hull);</span></div></div><div><div><div>31</div></div><div><span>        </span><span>return</span><span> </span><span>set</span><span>.</span><span>toArray</span><span>(</span><span>new</span><span> </span><span>int</span><span>[</span><span>set</span><span>.</span><span>size</span><span>()][</span><span>2</span><span>]);</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>    </span><span>// compare (q[1] - p[1]) / (q[0] - p[0]) and (r[1] - q[1]) / (r[0] - q[0])</span></div></div><div><div><div>35</div></div><div><span>    </span><span>// return true if pq and qr form a clockwise turn</span></div></div><div><div><div>36</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>orientation</span><span>(</span><span>int</span><span><span>[] </span><span>p</span><span>, </span></span><span>int</span><span><span>[] </span><span>q</span><span>, </span></span><span>int</span><span><span>[] </span><span>r</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>37</div></div><div><span>        </span><span>return</span><span> (q[</span><span>1</span><span><span>] </span><span>-</span><span> p[</span></span><span>1</span><span><span>]) </span><span>*</span><span> (r[</span></span><span>0</span><span><span>] </span><span>-</span><span> q[</span></span><span>0</span><span><span>]) </span><span>&gt;</span><span> (q[</span></span><span>0</span><span><span>] </span><span>-</span><span> p[</span></span><span>0</span><span><span>]) </span><span>*</span><span> (r[</span></span><span>1</span><span><span>] </span><span>-</span><span> q[</span></span><span>1</span><span>]);</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>588. Design In-Memory File System<a href="#588-design-in-memory-file-system"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/design-in-memory-file-system/" target="_blank">https://leetcode.com/problems/design-in-memory-file-system/</a></p><hr /><p>设计上有几个要点：</p><ul>
<li>自定义一个<code>FileNode</code>数据结构，可以给这个数据结构加一个属性来区分这个<code>FileNode</code>是一个文件夹还是一个具体文件，这在之后的路径寻址上有很大帮助。此处可以直接使用一个StringBuilder对象一举两得，这个对象又可以用于存储具体的文件内容，又可以兼任这个区分属性</li>
<li>维护一个<code>FileNode</code>的所有子节点，可以直接使用Tree Map，因为输出文件时也需要按照字典序输出</li>
<li>在寻址的时候，先用<code>split()</code>方法分割路径，之后进行判断，如果遇到的是文件夹直接跳过；如果是文件，还需要考虑这个文件是已有的文件还是新文件，这一点可以利用map的<code>putIfAbsent()</code>方法实现</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>FileSystem</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>    </span><span>private</span><span> </span><span>FileNode</span><span> root</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>public</span><span> </span><span>FileSystem</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>root </span><span>=</span><span> </span><span>new</span><span> </span><span>FileNode</span><span>(</span><span>""</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>ls</span><span>(</span><span>String</span><span><span> </span><span>path</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>return</span><span> </span><span>findNode</span><span>(path).</span><span>getList</span><span>();</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>mkdir</span><span>(</span><span>String</span><span><span> </span><span>path</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>14</div></div><div><span>        </span><span>findNode</span><span>(path);</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span>public</span><span> </span><span>void</span><span> </span><span>addContentToFile</span><span>(</span><span>String</span><span><span> </span><span>filePath</span><span>, </span></span><span>String</span><span><span> </span><span>content</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>18</div></div><div><span>        </span><span>findNode</span><span>(filePath).</span><span>addContent</span><span>(content);</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>readContentFromFile</span><span>(</span><span>String</span><span><span> </span><span>filePath</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>return</span><span> </span><span>findNode</span><span>(filePath).</span><span>getContent</span><span>();</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>    </span><span>private</span><span> </span><span>FileNode</span><span> </span><span>findNode</span><span>(</span><span>String</span><span><span> </span><span>path</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>26</div></div><div><span>        </span><span>String</span><span><span>[] </span><span>files</span><span> </span></span><span><span>=</span><span> </span></span><span>path</span><span>.</span><span>split</span><span>(</span><span>"/"</span><span>);</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>FileNode</span><span><span> </span><span>cur</span><span> </span></span><span><span>=</span><span> root;</span></span></div></div><div><div><div>29</div></div><div><span>        </span><span>for</span><span> (</span><span>String</span><span><span> </span><span>file</span><span> </span></span><span>:</span><span> files) {</span></div></div><div><div><div>30</div></div><div><span>            </span><span>// current directory is still a folder, continue</span></div></div><div><div><div>31</div></div><div><span>            </span><span>if</span><span> (</span><span>file</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>32</div></div><div><span>                </span><span>continue</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>            </span><span>// add a new file, or modify an existed file</span></div></div><div><div><div>36</div></div><div><span>            </span><span>cur</span><span>.</span><span>children</span><span>.</span><span>putIfAbsent</span><span>(file, </span><span>new</span><span> </span><span>FileNode</span><span>(file));</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>cur </span><span>=</span><span> </span><span>cur</span><span>.</span><span>children</span><span>.</span><span>get</span><span>(file);</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>            </span><span>if</span><span> (</span><span>cur</span><span>.</span><span>isFile</span><span>()) {</span></div></div><div><div><div>40</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>        </span><span>return</span><span> cur;</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>    </span><span>private</span><span> </span><span>class</span><span><span> </span><span>FileNode</span><span> </span></span><span>{</span></div></div><div><div><div>48</div></div><div><span>        </span><span>private</span><span> </span><span>TreeMap</span><span>&lt;</span><span>String</span><span><span>,</span><span> </span></span><span>FileNode</span><span><span>&gt;</span><span> children</span></span><span>;</span></div></div><div><div><div>49</div></div><div><span>        </span><span>private</span><span> </span><span>StringBuilder</span><span> file</span><span>;</span></div></div><div><div><div>50</div></div><div><span>        </span><span>private</span><span> </span><span>String</span><span> name</span><span>;</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>        </span><span>public</span><span> </span><span>FileNode</span><span>(</span><span>String</span><span><span> </span><span>name</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>53</div></div><div><span><span>            </span></span><span>children </span><span>=</span><span> </span><span>new</span><span> </span><span>TreeMap</span><span>&lt;&gt;();</span></div></div><div><div><div>54</div></div><div><span><span>            </span></span><span>file </span><span>=</span><span> </span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>55</div></div><div><span>            </span><span>this</span><span>.</span><span>name</span><span><span> </span><span>=</span><span> name;</span></span></div></div><div><div><div>56</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>57</div></div><div>
</div></div><div><div><div>58</div></div><div><span>        </span><span>public</span><span> </span><span>String</span><span> </span><span>getContent</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>59</div></div><div><span>            </span><span>return</span><span> </span><span>file</span><span>.</span><span>toString</span><span>();</span></div></div><div><div><div>60</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>61</div></div><div>
</div></div><div><div><div>62</div></div><div><span>        </span><span>public</span><span> </span><span>String</span><span> </span><span>getName</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>63</div></div><div><span>            </span><span>return</span><span> name;</span></div></div><div><div><div>64</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>65</div></div><div>
</div></div><div><div><div>66</div></div><div><span>        </span><span>public</span><span> </span><span>void</span><span> </span><span>addContent</span><span>(</span><span>String</span><span><span> </span><span>content</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>67</div></div><div><span>            </span><span>file</span><span>.</span><span>append</span><span>(content);</span></div></div><div><div><div>68</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>69</div></div><div>
</div></div><div><div><div>70</div></div><div><span>        </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isFile</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>71</div></div><div><span>            </span><span>return</span><span> </span><span>file</span><span>.</span><span>length</span><span><span>() </span><span>&gt;</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>72</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>73</div></div><div>
</div></div><div><div><div>74</div></div><div><span>        </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt;</span><span> </span></span><span>getList</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>75</div></div><div><span>            </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>list</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>76</div></div><div><span>            </span><span>if</span><span> (</span><span>isFile</span><span>()) {</span></div></div><div><div><div>77</div></div><div><span>                </span><span>list</span><span>.</span><span>add</span><span>(</span><span>getName</span><span>());</span></div></div><div><div><div>78</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>79</div></div><div><span>                </span><span>list</span><span>.</span><span>addAll</span><span>(</span><span>children</span><span>.</span><span>keySet</span><span>());</span></div></div><div><div><div>80</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>81</div></div><div>
</div></div><div><div><div>82</div></div><div><span>            </span><span>return</span><span> list;</span></div></div><div><div><div>83</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>84</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>85</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>589. N-ary Tree Preorder Traversal<a href="#589-n-ary-tree-preorder-traversal"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/n-ary-tree-preorder-traversal/" target="_blank">https://leetcode.com/problems/n-ary-tree-preorder-traversal/</a></p><hr /><p>第一种方法，直接使用递归：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public List&lt;Node&gt; children;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node() {}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>public Node(int _val) {</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>public Node(int _val, List&lt;Node&gt; _children) {</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>children = _children;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>};</span></div></div><div><div><div>18</div></div><div><span>*/</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>21</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>preorder</span><span>(</span><span>Node</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>23</div></div><div><span>        </span><span>helper</span><span>(result, root);</span></div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>helper</span><span>(</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span>, </span></span><span>Node</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>28</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>        </span><span>for</span><span> (</span><span>Node</span><span><span> </span><span>child</span><span> </span></span><span>:</span><span> </span><span>node</span><span>.</span><span>children</span><span>) {</span></div></div><div><div><div>34</div></div><div><span>            </span><span>helper</span><span>(result, child);</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>第二种方法，使用栈迭代访问，注意添加子节点时，需要从最后一个子节点开始压入栈中。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public List&lt;Node&gt; children;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node() {}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>public Node(int _val) {</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>public Node(int _val, List&lt;Node&gt; _children) {</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>children = _children;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>};</span></div></div><div><div><div>18</div></div><div><span>*/</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>21</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>preorder</span><span>(</span><span>Node</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>list</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>return</span><span> list;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>Node</span><span><span>&gt; </span><span>stack</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;&gt;();</span></div></div><div><div><div>28</div></div><div><span>        </span><span>stack</span><span>.</span><span>add</span><span>(root);</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>stack</span><span>.</span><span>empty</span><span>()) {</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>root </span><span>=</span><span> </span><span>stack</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>32</div></div><div><span>            </span><span>list</span><span>.</span><span>add</span><span>(</span><span>root</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>33</div></div><div><span>            </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>root</span><span>.</span><span>children</span><span>.</span><span>size</span><span><span>() </span><span>-</span><span> </span></span><span>1</span><span><span>; i </span><span>&gt;=</span><span> </span></span><span>0</span><span>; i--) {</span></div></div><div><div><div>34</div></div><div><span>                </span><span>stack</span><span>.</span><span>add</span><span>(</span><span>root</span><span>.</span><span>children</span><span>.</span><span>get</span><span>(i));</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> list;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>590. N-ary Tree Postorder Traversal<a href="#590-n-ary-tree-postorder-traversal"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/n-ary-tree-postorder-traversal/" target="_blank">https://leetcode.com/problems/n-ary-tree-postorder-traversal/</a></p><hr /><p>第一种方法，直接使用递归：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public List&lt;Node&gt; children;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node() {}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>public Node(int _val) {</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>public Node(int _val, List&lt;Node&gt; _children) {</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>children = _children;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>};</span></div></div><div><div><div>18</div></div><div><span>*/</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>21</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>postorder</span><span>(</span><span>Node</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>23</div></div><div><span>        </span><span>helper</span><span>(result, root);</span></div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>helper</span><span>(</span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>result</span><span>, </span></span><span>Node</span><span><span> </span><span>node</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>28</div></div><div><span>        </span><span>if</span><span><span> (node </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>29</div></div><div><span>            </span><span>return</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>        </span><span>for</span><span> (</span><span>Node</span><span><span> </span><span>child</span><span> </span></span><span>:</span><span> </span><span>node</span><span>.</span><span>children</span><span>) {</span></div></div><div><div><div>33</div></div><div><span>            </span><span>helper</span><span>(result, child);</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>        </span><span>result</span><span>.</span><span>add</span><span>(</span><span>node</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>第二种方法，使用栈迭代访问，添加完所有子节点后，翻转list即可。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/*</span></div></div><div><div><div>2</div></div><div><span>// Definition for a Node.</span></div></div><div><div><div>3</div></div><div><span>class Node {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>public int val;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>public List&lt;Node&gt; children;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>public Node() {}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>public Node(int _val) {</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>public Node(int _val, List&lt;Node&gt; _children) {</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>val = _val;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>children = _children;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>};</span></div></div><div><div><div>18</div></div><div><span>*/</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>21</div></div><div><span>    </span><span>public</span><span> </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt;</span><span> </span></span><span>postorder</span><span>(</span><span>Node</span><span><span> </span><span>root</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>22</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>list</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>ArrayList</span><span>&lt;&gt;();</span></div></div><div><div><div>23</div></div><div><span>        </span><span>if</span><span><span> (root </span><span>==</span><span> </span></span><span>null</span><span>) {</span></div></div><div><div><div>24</div></div><div><span>            </span><span>return</span><span> list;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>Stack</span><span>&lt;</span><span>Node</span><span><span>&gt; </span><span>stack</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>Stack</span><span>&lt;&gt;();</span></div></div><div><div><div>28</div></div><div><span>        </span><span>stack</span><span>.</span><span>add</span><span>(root);</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>stack</span><span>.</span><span>empty</span><span>()) {</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>root </span><span>=</span><span> </span><span>stack</span><span>.</span><span>pop</span><span>();</span></div></div><div><div><div>32</div></div><div><span>            </span><span>list</span><span>.</span><span>add</span><span>(</span><span>root</span><span>.</span><span>val</span><span>);</span></div></div><div><div><div>33</div></div><div><span>            </span><span>for</span><span> (</span><span>Node</span><span><span> </span><span>child</span><span> </span></span><span>:</span><span> </span><span>root</span><span>.</span><span>children</span><span>) {</span></div></div><div><div><div>34</div></div><div><span>                </span><span>stack</span><span>.</span><span>add</span><span>(child);</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>        </span><span>Collections</span><span>.</span><span>reverse</span><span>(list);</span></div></div><div><div><div>39</div></div><div><span>        </span><span>return</span><span> list;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>591. Tag Validator<a href="#591-tag-validator"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/tag-validator/" target="_blank">https://leetcode.com/problems/tag-validator/</a></p><hr /><p>使用正则表达式：</p><ul>
<li>用非贪心的模式<code>.*?</code>匹配<code>CDATA</code></li>
<li>尝试用先<code>([A,Z]{1,9})</code>后<code>\\1</code>的组合，匹配Tag name</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>isValid</span><span>(</span><span>String</span><span><span> </span><span>code</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span> (</span><span>code</span><span>.</span><span>equals</span><span>(</span><span>"t"</span><span>)) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>code </span><span>=</span><span> </span><span>code</span><span>.</span><span>replaceAll</span><span>(</span><span>"&lt;!</span><span>\\</span><span>[CDATA</span><span>\\</span><span>[.*?</span><span>\\</span><span>]</span><span>\\</span><span>]&gt;"</span><span>, </span><span>"c"</span><span>);</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>        </span><span>String</span><span><span> </span><span>prev</span><span> </span></span><span><span>=</span><span> </span></span><span>""</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>while</span><span><span> (</span><span>!</span></span><span>code</span><span>.</span><span>equals</span><span>(prev)) {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>prev </span><span>=</span><span> code;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>code </span><span>=</span><span> </span><span>code</span><span>.</span><span>replaceAll</span><span>(</span><span>"&lt;([A-Z]{1,9})&gt;[^&lt;]*&lt;/</span><span>\\</span><span>1&gt;"</span><span>, </span><span>"t"</span><span>);</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>return</span><span> </span><span>code</span><span>.</span><span>equals</span><span>(</span><span>"t"</span><span>);</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>592. Fraction Addition and Subtraction<a href="#592-fraction-addition-and-subtraction"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/fraction-addition-and-subtraction/" target="_blank">https://leetcode.com/problems/fraction-addition-and-subtraction/</a></p><hr /><p>使用两个StringBuilder，分别存储每个分数分子和分母，之后把这两个StringBuilder转化成整数形式，并累加分数。累加后，计算分子和分母的最大公约数，再进行约分。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>fractionAddition</span><span>(</span><span>String</span><span><span> </span><span>expression</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>if</span><span><span> (expression </span><span>==</span><span> </span></span><span>null</span><span><span> </span><span>||</span><span> </span></span><span>expression</span><span>.</span><span>length</span><span><span>() </span><span>==</span><span> </span></span><span>0</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>return</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>dividend</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>int</span><span><span> </span><span>denominator</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>expression</span><span>.</span><span>length</span><span>()) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>StringBuilder</span><span><span> </span><span>dividendSB</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>            </span><span>// get dividend</span></div></div><div><div><div>14</div></div><div><span>            </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>expression</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>expression</span><span>.</span><span>charAt</span><span><span>(i) </span><span>!=</span><span> </span></span><span>'/'</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>                </span><span>dividendSB</span><span>.</span><span>append</span><span>(</span><span>expression</span><span>.</span><span>charAt</span><span>(i));</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>i++;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>            </span><span>// get denominator</span></div></div><div><div><div>21</div></div><div><span>            </span><span>StringBuilder</span><span><span> </span><span>denominatorSB</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>();</span></div></div><div><div><div>22</div></div><div><span>            </span><span>while</span><span><span> (i </span><span>&lt;</span><span> </span></span><span>expression</span><span>.</span><span>length</span><span><span>() </span><span>&amp;&amp;</span><span> </span></span><span>Character</span><span>.</span><span>isDigit</span><span>(</span><span>expression</span><span>.</span><span>charAt</span><span>(i))) {</span></div></div><div><div><div>23</div></div><div><span>                </span><span>denominatorSB</span><span>.</span><span>append</span><span>(</span><span>expression</span><span>.</span><span>charAt</span><span>(i));</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>i++;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>            </span><span>// parse to integer</span></div></div><div><div><div>28</div></div><div><span>            </span><span>int</span><span><span> </span><span>newDividend</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>parseInt</span><span>(</span><span>dividendSB</span><span>.</span><span>toString</span><span>());</span></div></div><div><div><div>29</div></div><div><span>            </span><span>int</span><span><span> </span><span>newDenominator</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>parseInt</span><span>(</span><span>denominatorSB</span><span>.</span><span>toString</span><span>());</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>            </span><span>// directly add fraction</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>dividend </span><span>=</span><span> dividend </span><span>*</span><span> newDenominator </span><span>+</span><span>  newDividend </span><span>*</span><span> denominator;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>denominator </span><span>=</span><span> denominator </span><span>*</span><span> newDenominator;</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>            </span><span>// find gcd then reduce fraction</span></div></div><div><div><div>36</div></div><div><span>            </span><span>int</span><span><span> </span><span>gcd</span><span> </span></span><span><span>=</span><span> </span></span><span>findgcd</span><span>(dividend, denominator);</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>dividend </span><span>=</span><span> dividend </span><span>/</span><span> gcd;</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>denominator </span><span>=</span><span> denominator </span><span>/</span><span> gcd;</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>        </span><span>return</span><span><span> dividend </span><span>+</span><span> </span></span><span>"/"</span><span><span> </span><span>+</span><span> denominator;</span></span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findgcd</span><span>(</span><span>int</span><span><span> </span><span>a</span><span>, </span></span><span>int</span><span><span> </span><span>b</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>45</div></div><div><span>        </span><span>return</span><span><span> (a </span><span>!=</span><span> </span></span><span>0</span><span>) </span><span>?</span><span> </span><span>findgcd</span><span><span>(b </span><span>%</span><span> a, a) </span></span><span>:</span><span> </span><span>Math</span><span>.</span><span>abs</span><span>(b);</span></div></div><div><div><div>46</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>47</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>593. Valid Square<a href="#593-valid-square"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/valid-square/" target="_blank">https://leetcode.com/problems/valid-square/</a></p><hr /><p>如果四个点能组成正方形，这四个点的距离两两连线，只会有两种情况：边长和对角线长。根据这一特性，我们可以尝试用HashSet添加所有两两连线的距离，观察最后值的个数。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>boolean</span><span> </span><span>validSquare</span><span>(</span><span>int</span><span><span>[] </span><span>p1</span><span>, </span></span><span>int</span><span><span>[] </span><span>p2</span><span>, </span></span><span>int</span><span><span>[] </span><span>p3</span><span>, </span></span><span>int</span><span><span>[] </span><span>p4</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>HashSet</span><span>&lt;</span><span>Integer</span><span><span>&gt; </span><span>hs</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashSet</span><span>&lt;&gt;(</span><span>Arrays</span><span>.</span><span>asList</span><span>(</span><span>dist</span><span>(p1, p2), </span><span>dist</span><span>(p1, p3), </span><span>dist</span><span>(p1, p4),</span></div></div><div><div><div>4</div></div><div><span>                                                          </span><span>dist</span><span>(p2, p3), </span><span>dist</span><span>(p2, p4), </span><span>dist</span><span>(p3, p4))</span></div></div><div><div><div>5</div></div><div><span><span>                                           </span></span><span>);</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>        </span><span>// side and diagonal</span></div></div><div><div><div>8</div></div><div><span>        </span><span>return</span><span><span> </span><span>!</span></span><span>hs</span><span>.</span><span>contains</span><span>(</span><span>0</span><span><span>) </span><span>&amp;&amp;</span><span> </span></span><span>hs</span><span>.</span><span>size</span><span><span>() </span><span>==</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span>private</span><span> </span><span>int</span><span> </span><span>dist</span><span>(</span><span>int</span><span><span>[] </span><span>a</span><span>, </span></span><span>int</span><span><span>[] </span><span>b</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span> (a[</span><span>0</span><span><span>] </span><span>-</span><span> b[</span></span><span>0</span><span><span>]) </span><span>*</span><span> (a[</span></span><span>0</span><span><span>] </span><span>-</span><span> b[</span></span><span>0</span><span><span>]) </span><span>+</span><span> (a[</span></span><span>1</span><span><span>] </span><span>-</span><span> b[</span></span><span>1</span><span><span>]) </span><span>*</span><span> (a[</span></span><span>1</span><span><span>] </span><span>-</span><span> b[</span></span><span>1</span><span>]);</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>594. Longest Harmonious Subsequence<a href="#594-longest-harmonious-subsequence"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/longest-harmonious-subsequence/" target="_blank">https://leetcode.com/problems/longest-harmonious-subsequence/</a></p><hr /><p>用一个HashMap统计每个数字出现的频率，之后遍历map中的所有key，如果key和key + 1都存在于map中，说明由所有key和key + 1组成的序列就是一个harmonious subsequence，其长度为二者的频率之和。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findLHS</span><span>(</span><span>int</span><span><span>[] </span><span>nums</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// &lt;num, freq&gt;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>Integer</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>5</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>num</span><span> </span></span><span>:</span><span> nums) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(num, </span><span>map</span><span>.</span><span>getOrDefault</span><span>(num, </span><span>0</span><span><span>) </span><span>+</span><span> </span></span><span>1</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span>;</span></div></div><div><div><div>10</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>key</span><span> </span></span><span>:</span><span> </span><span>map</span><span>.</span><span>keySet</span><span>()) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>if</span><span> (</span><span>map</span><span>.</span><span>containsKey</span><span><span>(key </span><span>+</span><span> </span></span><span>1</span><span>)) {</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>result </span><span>=</span><span> </span><span>Math</span><span>.</span><span>max</span><span>(result, </span><span>map</span><span>.</span><span>get</span><span><span>(key </span><span>+</span><span> </span></span><span>1</span><span><span>) </span><span>+</span><span> </span></span><span>map</span><span>.</span><span>get</span><span>(key));</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>595. Big Countries<a href="#595-big-countries"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/big-countries/" target="_blank">https://leetcode.com/problems/big-countries/</a></p><hr /><p>直接根据条件筛选即可。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>name</span><span>, </span><span>population</span><span>, area</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> World</span></div></div><div><div><div>3</div></div><div><span>WHERE</span><span> </span><span>population</span><span><span> </span><span>&gt;</span><span> </span></span><span>25000000</span><span> </span><span>OR</span><span><span> area </span><span>&gt;</span><span> </span></span><span>3000000</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>596. Classes More Than 5 Students<a href="#596-classes-more-than-5-students"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/classes-more-than-5-students/" target="_blank">https://leetcode.com/problems/classes-more-than-5-students/</a></p><hr /><p>按照<code>class</code>做Group By后，统计所有不重复的学生数量。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> class</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> courses</span></div></div><div><div><div>3</div></div><div><span>GROUP BY</span><span> class</span></div></div><div><div><div>4</div></div><div><span>HAVING</span><span> </span><span>COUNT</span><span>(</span><span>DISTINCT</span><span><span> student) </span><span>&gt;=</span><span> </span></span><span>5</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>597. Friend Requests I: Overall Acceptance Rate<a href="#597-friend-requests-i-overall-acceptance-rate"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/friend-requests-i-overall-acceptance-rate/" target="_blank">https://leetcode.com/problems/friend-requests-i-overall-acceptance-rate/</a></p><hr /><p>因为两张表都没有主键，可能存在重复，因此在统计请求和接受总量时都需要带上<code>DISTINCT</code>；并且需要考虑到数据长度为0的情况，即用<code>IFNULL()</code>进行处理；最后还需要用<code>ROUND()</code>保留2位小数。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>ROUND</span><span>(</span><span>IFNULL</span><span>(</span><span>COUNT</span><span>(</span><span>DISTINCT</span><span> requester_id, accepter_id) / </span><span>COUNT</span><span>(</span><span>DISTINCT</span><span> sender_id, send_to_id), </span><span>0</span><span>), </span><span>2</span><span>) </span><span>AS</span><span> accept_rate</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> FriendRequest, RequestAccepted;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>于Follow-up问题，可以额外做两组子查询，一组找出<code>RequestAccepted</code>中所有不同accept的月份，另一组找出<code>FriendRequest</code>中所有不同request的月份，如果二者月份相同，就计算出这个月中的接受率。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>SELECT</span><span> </span><span>IF</span><span>(</span><span>d</span><span>.</span><span>req</span><span><span> </span><span>=</span><span> </span></span><span>0</span><span>, </span><span>0</span><span>.</span><span>00</span><span>, </span><span>ROUND</span><span>(</span><span>c</span><span>.</span><span>acp</span><span> / </span><span>d</span><span>.</span><span>req</span><span>, </span><span>2</span><span>)) </span><span>AS</span><span> accept_rate, </span><span>c</span><span>.</span><span>month</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> (</span></div></div><div><div><div>3</div></div><div><span>    </span><span>SELECT</span><span> </span><span>COUNT</span><span>(</span><span>DISTINCT</span><span> requester_id, accepter_id) </span><span>AS</span><span> </span><span>acp</span><span>, </span><span>Month</span><span>(accept_date) </span><span>AS</span><span> </span><span>month</span><span> </span><span>FROM</span><span> RequestAccepted) c,</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>(</span><span>SELECT</span><span> </span><span>COUNT</span><span>(</span><span>DISTINCT</span><span> sender_id, send_to_id) </span><span>AS</span><span> req, </span><span>Month</span><span>(request_date) </span><span>AS</span><span> </span><span>month</span><span> </span><span>FROM</span><span> FriendRequest) d</span></div></div><div><div><div>5</div></div><div><span>WHERE</span><span> </span><span>c</span><span>.</span><span>month</span><span><span> </span><span>=</span><span> </span></span><span>d</span><span>.</span><span>month</span></div></div><div><div><div>6</div></div><div><span>GROUP BY</span><span> </span><span>c</span><span>.</span><span>month</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>598. Range Addition II<a href="#598-range-addition-ii"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/range-addition-ii/" target="_blank">https://leetcode.com/problems/range-addition-ii/</a></p><hr /><p>找出<code>ops</code>中最小的<code>ai</code>和<code>bi</code>即可，在此范围内的数都是最大值。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>maxCount</span><span>(</span><span>int</span><span><span> </span><span>m</span><span>, </span></span><span>int</span><span><span> </span><span>n</span><span>, </span></span><span>int</span><span><span>[][] </span><span>ops</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span> ; i </span><span>&lt;</span><span> </span></span><span>ops</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>4</div></div><div><span>            </span><span>if</span><span> (ops[i][</span><span>0</span><span><span>] </span><span>&lt;</span><span> m) {</span></span></div></div><div><div><div>5</div></div><div><span><span>                </span></span><span>m </span><span>=</span><span> ops[i][</span><span>0</span><span>];</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>            </span><span>if</span><span> (ops[i][</span><span>1</span><span><span>] </span><span>&lt;</span><span> n) {</span></span></div></div><div><div><div>8</div></div><div><span><span>                </span></span><span>n </span><span>=</span><span> ops[i][</span><span>1</span><span>];</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>return</span><span><span> m </span><span>*</span><span> n;</span></span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>599. Minimum Index Sum of Two Lists<a href="#599-minimum-index-sum-of-two-lists"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/minimum-index-sum-of-two-lists/" target="_blank">https://leetcode.com/problems/minimum-index-sum-of-two-lists/</a></p><hr /><p>先遍历一遍<code>list1</code>，把每个元素以及对应的下标存储到HashMap中。之后再遍历<code>list2</code>，看<code>list2</code>中的每个元素是否在map中，如果map中能找到，就计算二者的下标之和，并且把结果添加到<code>result</code>中。一旦后续了发现下标和更小的结果，就把<code>result</code>清空，重新添加。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span>[] </span><span>findRestaurant</span><span>(</span><span>String</span><span><span>[] </span><span>list1</span><span>, </span></span><span>String</span><span><span>[] </span><span>list2</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>List</span><span>&lt;</span><span>String</span><span><span>&gt; </span><span>result</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>LinkedList</span><span>&lt;&gt;();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>        </span><span>// &lt;list1 element, list1 index&gt;</span></div></div><div><div><div>6</div></div><div><span>        </span><span>Map</span><span>&lt;</span><span>String</span><span>, </span><span>Integer</span><span><span>&gt; </span><span>map</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>HashMap</span><span>&lt;&gt;();</span></div></div><div><div><div>7</div></div><div><span>        </span><span>int</span><span><span> </span><span>minSum</span><span> </span></span><span><span>=</span><span> </span></span><span>Integer</span><span>.</span><span>MAX_VALUE</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; i </span><span>&lt;</span><span> </span></span><span>list1</span><span>.</span><span>length</span><span>; i++) {</span></div></div><div><div><div>10</div></div><div><span>            </span><span>map</span><span>.</span><span>put</span><span>(list1[i], i);</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>j</span><span> </span></span><span><span>=</span><span> </span></span><span>0</span><span><span>; j </span><span>&lt;</span><span> </span></span><span>list2</span><span>.</span><span>length</span><span>; j++) {</span></div></div><div><div><div>13</div></div><div><span>            </span><span>Integer</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>map</span><span>.</span><span>get</span><span>(list2[j]);</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span><span> (i </span><span>!=</span><span> </span></span><span>null</span><span><span> </span><span>&amp;&amp;</span><span> i </span><span>+</span><span> j </span><span>&lt;=</span><span> minSum) {</span></span></div></div><div><div><div>15</div></div><div><span>                </span><span>if</span><span><span> (i </span><span>+</span><span> j </span><span>&lt;</span><span> minSum) {</span></span></div></div><div><div><div>16</div></div><div><span>                    </span><span>// update with latest minimum sum</span></div></div><div><div><div>17</div></div><div><span>                    </span><span>result</span><span>.</span><span>clear</span><span>();</span></div></div><div><div><div>18</div></div><div><span><span>                    </span></span><span>minSum </span><span>=</span><span> i</span><span>+</span><span>j;</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>                </span><span>result</span><span>.</span><span>add</span><span>(list2[j]);</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> </span><span>result</span><span>.</span><span>toArray</span><span>(</span><span>new</span><span> </span><span>String</span><span>[</span><span>result</span><span>.</span><span>size</span><span>()]);</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>600. Non-negative Integers without Consecutive Ones<a href="#600-non-negative-integers-without-consecutive-ones"><span>#</span></a></h2><p><a href="https://leetcode.com/problems/non-negative-integers-without-consecutive-ones/" target="_blank">https://leetcode.com/problems/non-negative-integers-without-consecutive-ones/</a></p><hr /><p>使用动态规划，两个数组<code>a[]</code>和<code>b[]</code>分别用于不同存储，其中<code>a[i]</code>表示长度为<code>i</code>的二进制字符串中，没有两个连续1并且结尾是0的个数；<code>b[i]</code>表示长度为i的二进制字符串中，没有两个连续1并且结尾是1的个数。很显然，结尾是0的字符串我们可以任意添加0或者1，但是结尾已经是1的字符串中我们只能添加0，由此可以得出递归公式。最后，减去结果中大于<code>num</code>的情况。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Solution</span><span> </span></span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>public</span><span> </span><span>int</span><span> </span><span>findIntegers</span><span>(</span><span>int</span><span><span> </span><span>num</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>StringBuilder</span><span><span> </span><span>sb</span><span> </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>StringBuilder</span><span>(</span><span>Integer</span><span>.</span><span>toBinaryString</span><span>(num));</span></div></div><div><div><div>4</div></div><div><span>        </span><span>int</span><span><span> </span><span>n</span><span> </span></span><span><span>=</span><span> </span></span><span>sb</span><span>.</span><span>length</span><span>();</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>        </span><span>// a[i] is the number of binary strings of length i which do not contain any two consecutive 1’s and which end in 0</span></div></div><div><div><div>7</div></div><div><span>        </span><span>// b[i] is the number of such strings which end in 1</span></div></div><div><div><div>8</div></div><div><span>        </span><span>// we can append either 0 or 1 to a string ending in 0, but we can only append 0 to a string ending in 1</span></div></div><div><div><div>9</div></div><div><span>        </span><span>int</span><span><span> </span><span>a</span><span>[] </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>10</div></div><div><span>        </span><span>int</span><span><span> </span><span>b</span><span>[] </span></span><span><span>=</span><span> </span></span><span>new</span><span> </span><span>int</span><span>[n];</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>a[</span><span>0</span><span><span>] </span><span>=</span><span> b[</span></span><span>0</span><span><span>] </span><span>=</span><span> </span></span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>a[i] </span><span>=</span><span> a[i </span><span>-</span><span> </span><span>1</span><span><span>] </span><span>+</span><span> b[i </span><span>-</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>b[i] </span><span>=</span><span> a[i </span><span>-</span><span> </span><span>1</span><span>];</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>        </span><span>int</span><span><span> </span><span>result</span><span> </span></span><span><span>=</span><span> a[n </span><span>-</span><span> </span></span><span>1</span><span><span>] </span><span>+</span><span> b[n </span><span>-</span><span> </span></span><span>1</span><span>];</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>        </span><span>// subtract the solutions which is larger than num</span></div></div><div><div><div>19</div></div><div><span>        </span><span>for</span><span> (</span><span>int</span><span><span> </span><span>i</span><span> </span></span><span><span>=</span><span> </span></span><span>1</span><span><span>; i </span><span>&lt;</span><span> n; i++) {</span></span></div></div><div><div><div>20</div></div><div><span>            </span><span>if</span><span> (</span><span>sb</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>'1'</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>sb</span><span>.</span><span>charAt</span><span><span>(i</span><span>-</span></span><span>1</span><span><span>) </span><span>==</span><span> </span></span><span>'1'</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>                </span><span>break</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>            </span><span>if</span><span> (</span><span>sb</span><span>.</span><span>charAt</span><span><span>(i) </span><span>==</span><span> </span></span><span>'0'</span><span><span> </span><span>&amp;&amp;</span><span> </span></span><span>sb</span><span>.</span><span>charAt</span><span><span>(i</span><span>-</span></span><span>1</span><span><span>) </span><span>==</span><span> </span></span><span>'0'</span><span>) {</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>result </span><span>-=</span><span> b[n</span><span>-</span><span>i</span><span>-</span><span>1</span><span>];</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>        </span><span>return</span><span> result;</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
</feed>
