<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>LeetCode 213 on Jeanphilo Blog</title><link>https://shio-chan-dev.github.io/jeanblog/zh/tags/leetcode-213/</link><description>Recent content in LeetCode 213 on Jeanphilo Blog</description><generator>Hugo -- 0.166.0</generator><language>zh-cn</language><lastBuildDate>Tue, 22 Sep 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://shio-chan-dev.github.io/jeanblog/zh/tags/leetcode-213/index.xml" rel="self" type="application/rss+xml"/><item><title>LeetCode 213：打家劫舍 II，环形拆成两个线性问题</title><link>https://shio-chan-dev.github.io/jeanblog/zh/alg/leetcode/hot100/213-house-robber-ii/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://shio-chan-dev.github.io/jeanblog/zh/alg/leetcode/hot100/213-house-robber-ii/</guid><description>&lt;h2 id="题目要求"&gt;题目要求&lt;/h2&gt;
&lt;h3 id="输入输出"&gt;输入输出&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;输入：整数数组 &lt;code&gt;nums&lt;/code&gt;，&lt;code&gt;nums[i]&lt;/code&gt; 表示第 &lt;code&gt;i&lt;/code&gt; 间房子的金额。&lt;/li&gt;
&lt;li&gt;房子首尾相连，不能偷相邻的两间房子，因此第 &lt;code&gt;0&lt;/code&gt; 间和第 &lt;code&gt;n - 1&lt;/code&gt; 间也不能同时偷。&lt;/li&gt;
&lt;li&gt;输出：在不触发警报的前提下，最多能偷到的金额。&lt;/li&gt;
&lt;li&gt;约束：&lt;code&gt;1 &amp;lt;= nums.length &amp;lt;= 100&lt;/code&gt;，&lt;code&gt;0 &amp;lt;= nums[i] &amp;lt;= 1000&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例"&gt;示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [2,3,2]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：第 0 间和第 2 间首尾相邻，不能同时偷；选择金额 3 的房子。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [1,2,3,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：可以偷下标 0 和下标 2，也可以偷下标 1 和下标 3。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [1,2,3]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这篇只用 Python，先从最小的首尾冲突开始。&lt;/p&gt;
&lt;h2 id="step-1先处理首尾相邻的冲突"&gt;Step 1：先处理首尾相邻的冲突&lt;/h2&gt;
&lt;p&gt;先问一个具体问题：&lt;code&gt;nums = [2,3,2]&lt;/code&gt; 时，能不能沿用直线街道的做法，直接在整个数组上选择不相邻的房子？&lt;/p&gt;
&lt;p&gt;当前基线只有一条规则：相邻房子不能同时偷。若把这三个数当成直线，可能会把下标 &lt;code&gt;0&lt;/code&gt; 和下标 &lt;code&gt;2&lt;/code&gt; 当成彼此不相邻，从而错误地选择两端，得到金额 &lt;code&gt;4&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这在环形输入上就会失败：首尾也相邻，&lt;code&gt;0&lt;/code&gt; 和 &lt;code&gt;2&lt;/code&gt; 必须互斥。要消除这一个冲突，只增加一个分支规则：任何合法方案至少属于下面一个候选分支。&lt;/p&gt;</description></item></channel></rss>