<?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>Kadane on Jeanphilo Blog</title><link>https://shio-chan-dev.github.io/jeanblog/zh/tags/kadane/</link><description>Recent content in Kadane on Jeanphilo Blog</description><generator>Hugo -- 0.161.1</generator><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 14:25:07 +0800</lastBuildDate><atom:link href="https://shio-chan-dev.github.io/jeanblog/zh/tags/kadane/index.xml" rel="self" type="application/rss+xml"/><item><title>LeetCode 53：最大子数组和，从 dp[i] 含义推出 Kadane</title><link>https://shio-chan-dev.github.io/jeanblog/zh/alg/leetcode/hot100/53-maximum-subarray/</link><pubDate>Sun, 03 May 2026 14:25:07 +0800</pubDate><guid>https://shio-chan-dev.github.io/jeanblog/zh/alg/leetcode/hot100/53-maximum-subarray/</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;/li&gt;
&lt;li&gt;输出：返回连续非空子数组的最大和&lt;/li&gt;
&lt;li&gt;子数组必须连续&lt;/li&gt;
&lt;li&gt;至少选一个元素&lt;/li&gt;
&lt;li&gt;约束：&lt;code&gt;1 &amp;lt;= nums.length &amp;lt;= 10^5&lt;/code&gt;，&lt;code&gt;-10^4 &amp;lt;= nums[i] &amp;lt;= 10^4&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,1,-3,4,-1,2,1,-5,4]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：[4,-1,2,1] 的和最大，为 6
&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]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这篇只用 Python，从 &lt;code&gt;dp[i]&lt;/code&gt; 的含义一步一步推出 Kadane 算法。&lt;/p&gt;
&lt;h2 id="从--21-34-的断点开始"&gt;从 &lt;code&gt;[-2,1,-3,4]&lt;/code&gt; 的断点开始&lt;/h2&gt;
&lt;p&gt;看一个前缀例子：&lt;/p&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, 1, -3, 4]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果走到 &lt;code&gt;4&lt;/code&gt;，有两种选择：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把前面的某个连续子数组接到 &lt;code&gt;4&lt;/code&gt; 前面&lt;/li&gt;
&lt;li&gt;从 &lt;code&gt;4&lt;/code&gt; 自己重新开始&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里的关键不是“所有子数组怎么枚举”，而是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;当我们决定一个最优子数组必须以当前位置结尾时，它的来源只有两种：接上前一个位置的最优结尾，或者从当前位置重新开始。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这就是一维 DP 的入口。&lt;/p&gt;
&lt;h2 id="step-1先定义一个更小的问题"&gt;Step 1：先定义一个更小的问题&lt;/h2&gt;
&lt;p&gt;直接问“整个数组的最大子数组和是多少”太大。我们先强加一个限制：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果子数组必须以第 &lt;code&gt;i&lt;/code&gt; 个元素结尾，它的最大和是多少？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个值记为 &lt;code&gt;dp[i]&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这里的 &lt;code&gt;dp[i]&lt;/code&gt; 不是“前 &lt;code&gt;i&lt;/code&gt; 个元素里的最大子数组和”。它更窄：&lt;/p&gt;</description></item></channel></rss>