Skip to content

Commit ce39c82

Browse files
committed
deploy: 1ea1077
1 parent 455f212 commit ce39c82

File tree

4 files changed

+35
-15
lines changed

4 files changed

+35
-15
lines changed

en/lc/1955/index.html

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50529,18 +50529,18 @@
5052950529
<ul class="md-nav__list">
5053050530

5053150531
<li class="md-nav__item">
50532-
<a href="#solution-1" class="md-nav__link">
50532+
<a href="#solution-1-dynamic-programming" class="md-nav__link">
5053350533
<span class="md-ellipsis">
50534-
Solution 1
50534+
Solution 1: Dynamic Programming
5053550535
</span>
5053650536
</a>
5053750537

5053850538
</li>
5053950539

5054050540
<li class="md-nav__item">
50541-
<a href="#solution-2" class="md-nav__link">
50541+
<a href="#solution-2-dynamic-programming-space-optimization" class="md-nav__link">
5054250542
<span class="md-ellipsis">
50543-
Solution 2
50543+
Solution 2: Dynamic Programming (Space Optimization)
5054450544
</span>
5054550545
</a>
5054650546

@@ -87157,7 +87157,24 @@ <h2 id="description">Description</h2>
8715787157
<h2 id="solutions">Solutions</h2>
8715887158
<!-- solution:start -->
8715987159

87160-
<h3 id="solution-1">Solution 1</h3>
87160+
<h3 id="solution-1-dynamic-programming">Solution 1: Dynamic Programming</h3>
87161+
<p>We define <span class="arithmatex">\(f[i][j]\)</span> to represent the number of special subsequences ending with <span class="arithmatex">\(j\)</span> among the first <span class="arithmatex">\(i+1\)</span> elements. Initially, <span class="arithmatex">\(f[i][j]=0\)</span>, and if <span class="arithmatex">\(nums[0]=0\)</span>, then <span class="arithmatex">\(f[0][0]=1\)</span>.</p>
87162+
<p>For <span class="arithmatex">\(i \gt 0\)</span>, we consider the value of <span class="arithmatex">\(nums[i]\)</span>:</p>
87163+
<p>If <span class="arithmatex">\(nums[i] = 0\)</span>: If we do not choose <span class="arithmatex">\(nums[i]\)</span>, then <span class="arithmatex">\(f[i][0] = f[i-1][0]\)</span>; if we choose <span class="arithmatex">\(nums[i]\)</span>, then <span class="arithmatex">\(f[i][0]=f[i-1][0]+1\)</span>, because we can add a <span class="arithmatex">\(0\)</span> to the end of any special subsequence ending with <span class="arithmatex">\(0\)</span> to get a new special subsequence, or we can use <span class="arithmatex">\(nums[i]\)</span> alone as a special subsequence. Therefore, <span class="arithmatex">\(f[i][0] = 2 \times f[i - 1][0] + 1\)</span>. The rest of <span class="arithmatex">\(f[i][j]\)</span> is equal to <span class="arithmatex">\(f[i-1][j]\)</span>.</p>
87164+
<p>If <span class="arithmatex">\(nums[i] = 1\)</span>: If we do not choose <span class="arithmatex">\(nums[i]\)</span>, then <span class="arithmatex">\(f[i][1] = f[i-1][1]\)</span>; if we choose <span class="arithmatex">\(nums[i]\)</span>, then <span class="arithmatex">\(f[i][1]=f[i-1][1]+f[i-1][0]\)</span>, because we can add a <span class="arithmatex">\(1\)</span> to the end of any special subsequence ending with <span class="arithmatex">\(0\)</span> or <span class="arithmatex">\(1\)</span> to get a new special subsequence. Therefore, <span class="arithmatex">\(f[i][1] = f[i-1][0] + 2 \times f[i - 1][1]\)</span>. The rest of <span class="arithmatex">\(f[i][j]\)</span> is equal to <span class="arithmatex">\(f[i-1][j]\)</span>.</p>
87165+
<p>If <span class="arithmatex">\(nums[i] = 2\)</span>: If we do not choose <span class="arithmatex">\(nums[i]\)</span>, then <span class="arithmatex">\(f[i][2] = f[i-1][2]\)</span>; if we choose <span class="arithmatex">\(nums[i]\)</span>, then <span class="arithmatex">\(f[i][2]=f[i-1][2]+f[i-1][1]\)</span>, because we can add a <span class="arithmatex">\(2\)</span> to the end of any special subsequence ending with <span class="arithmatex">\(1\)</span> or <span class="arithmatex">\(2\)</span> to get a new special subsequence. Therefore, <span class="arithmatex">\(f[i][2] = f[i-1][1] + 2 \times f[i - 1][2]\)</span>. The rest of <span class="arithmatex">\(f[i][j]\)</span> is equal to <span class="arithmatex">\(f[i-1][j]\)</span>.</p>
87166+
<p>In summary, we can get the following state transition equations:</p>
87167+
<div class="arithmatex">\[
87168+
\begin{aligned}
87169+
f[i][0] &amp;= 2 \times f[i - 1][0] + 1, \quad nums[i] = 0 \\
87170+
f[i][1] &amp;= f[i-1][0] + 2 \times f[i - 1][1], \quad nums[i] = 1 \\
87171+
f[i][2] &amp;= f[i-1][1] + 2 \times f[i - 1][2], \quad nums[i] = 2 \\
87172+
f[i][j] &amp;= f[i-1][j], \quad nums[i] \neq j
87173+
\end{aligned}
87174+
\]</div>
87175+
<p>The final answer is <span class="arithmatex">\(f[n-1][2]\)</span>.</p>
87176+
<p>The time complexity is <span class="arithmatex">\(O(n)\)</span>, and the space complexity is <span class="arithmatex">\(O(n)\)</span>. Where <span class="arithmatex">\(n\)</span> is the length of the array <span class="arithmatex">\(nums\)</span>.</p>
87177+
<p>Similar code found with 1 license type</p>
8716187178
<div class="tabbed-set tabbed-alternate" data-tabs="1:5"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Python3</label><label for="__tabbed_1_2">Java</label><label for="__tabbed_1_3">C++</label><label for="__tabbed_1_4">Go</label><label for="__tabbed_1_5">TypeScript</label></div>
8716287179
<div class="tabbed-content">
8716387180
<div class="tabbed-block">
@@ -87412,7 +87429,10 @@ <h3 id="solution-1">Solution 1</h3>
8741287429

8741387430
<!-- solution:start -->
8741487431

87415-
<h3 id="solution-2">Solution 2</h3>
87432+
<h3 id="solution-2-dynamic-programming-space-optimization">Solution 2: Dynamic Programming (Space Optimization)</h3>
87433+
<p>We notice that in the above state transition equations, the value of <span class="arithmatex">\(f[i][j]\)</span> is only related to <span class="arithmatex">\(f[i-1][j]\)</span>. Therefore, we can remove the first dimension and optimize the space complexity to <span class="arithmatex">\(O(1)\)</span>.</p>
87434+
<p>We can use an array <span class="arithmatex">\(f\)</span> of length 3 to represent the number of special subsequences ending with 0, 1, and 2, respectively. For each element in the array, we update the array <span class="arithmatex">\(f\)</span> according to the value of the current element.</p>
87435+
<p>The time complexity is <span class="arithmatex">\(O(n)\)</span>, and the space complexity is <span class="arithmatex">\(O(1)\)</span>. Where <span class="arithmatex">\(n\)</span> is the length of the array <span class="arithmatex">\(nums\)</span>.</p>
8741687436
<div class="tabbed-set tabbed-alternate" data-tabs="2:5"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><input id="__tabbed_2_3" name="__tabbed_2" type="radio" /><input id="__tabbed_2_4" name="__tabbed_2" type="radio" /><input id="__tabbed_2_5" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">Python3</label><label for="__tabbed_2_2">Java</label><label for="__tabbed_2_3">C++</label><label for="__tabbed_2_4">Go</label><label for="__tabbed_2_5">TypeScript</label></div>
8741787437
<div class="tabbed-content">
8741887438
<div class="tabbed-block">

en/search/search_index.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

lc/1955/index.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50580,7 +50580,7 @@
5058050580
<li class="md-nav__item">
5058150581
<a href="#_4" class="md-nav__link">
5058250582
<span class="md-ellipsis">
50583-
方法二
50583+
方法二:动态规划(空间优化)
5058450584
</span>
5058550585
</a>
5058650586

@@ -91959,20 +91959,19 @@ <h3 id="_3">方法一:动态规划</h3>
9195991959
<p>我们定义 <span class="arithmatex">\(f[i][j]\)</span> 表示前 <span class="arithmatex">\(i+1\)</span> 个元素中,以 <span class="arithmatex">\(j\)</span> 结尾的特殊子序列的个数。初始时 <span class="arithmatex">\(f[i][j]=0\)</span>,如果 <span class="arithmatex">\(nums[0]=0\)</span>,则 <span class="arithmatex">\(f[0][0]=1\)</span>。</p>
9196091960
<p>对于 <span class="arithmatex">\(i \gt 0\)</span>,我们考虑 <span class="arithmatex">\(nums[i]\)</span> 的值:</p>
9196191961
<p>如果 <span class="arithmatex">\(nums[i] = 0\)</span>:如果我们不选择 <span class="arithmatex">\(nums[i]\)</span>,则 <span class="arithmatex">\(f[i][0] = f[i-1][0]\)</span>;如果我们选择 <span class="arithmatex">\(nums[i]\)</span>,那么 <span class="arithmatex">\(f[i][0]=f[i-1][0]+1\)</span>,因为我们可以在任何一个以 <span class="arithmatex">\(0\)</span> 结尾的特殊子序列后面加上一个 <span class="arithmatex">\(0\)</span> 得到一个新的特殊子序列,也可以将 <span class="arithmatex">\(nums[i]\)</span> 单独作为一个特殊子序列。因此 <span class="arithmatex">\(f[i][0] = 2 \times f[i - 1][0] + 1\)</span>。其余的 <span class="arithmatex">\(f[i][j]\)</span> 与 <span class="arithmatex">\(f[i-1][j]\)</span> 相等。</p>
91962-
<p>如果 <span class="arithmatex">\(nums[i] = 1\)</span>:如果我们不选择 <span class="arithmatex">\(nums[i]\)</span>,则 <span class="arithmatex">\(f[i][1] = f[i-1][1]\)</span>;如果我们选择 <span class="arithmatex">\(nums[i]\)</span>,那么 <span class="arithmatex">\(f[i][1]=f[i-1][1]+f[i-1][0]\)</span>,因为我们可以在任何一个以 <span class="arithmatex">\(0\)</span> 或 <span class="arithmatex">\(1\)</span> 结尾的特殊子序列后面加上一个 <span class="arithmatex">\(1\)</span> 得到一个新的特殊子序列。因此 <span class="arithmatex">\(f[i][1] = f[i-1][1] + 2 \times f[i - 1][0]\)</span>。其余的 <span class="arithmatex">\(f[i][j]\)</span> 与 <span class="arithmatex">\(f[i-1][j]\)</span> 相等。</p>
91963-
<p>如果 <span class="arithmatex">\(nums[i] = 2\)</span>:如果我们不选择 <span class="arithmatex">\(nums[i]\)</span>,则 <span class="arithmatex">\(f[i][2] = f[i-1][2]\)</span>;如果我们选择 <span class="arithmatex">\(nums[i]\)</span>,那么 <span class="arithmatex">\(f[i][2]=f[i-1][2]+f[i-1][1]\)</span>,因为我们可以在任何一个以 <span class="arithmatex">\(1\)</span> 或 <span class="arithmatex">\(2\)</span> 结尾的特殊子序列后面加上一个 <span class="arithmatex">\(2\)</span> 得到一个新的特殊子序列。因此 <span class="arithmatex">\(f[i][2] = f[i-1][2] + 2 \times f[i - 1][1]\)</span>。其余的 <span class="arithmatex">\(f[i][j]\)</span> 与 <span class="arithmatex">\(f[i-1][j]\)</span> 相等。</p>
91962+
<p>如果 <span class="arithmatex">\(nums[i] = 1\)</span>:如果我们不选择 <span class="arithmatex">\(nums[i]\)</span>,则 <span class="arithmatex">\(f[i][1] = f[i-1][1]\)</span>;如果我们选择 <span class="arithmatex">\(nums[i]\)</span>,那么 <span class="arithmatex">\(f[i][1]=f[i-1][1]+f[i-1][0]\)</span>,因为我们可以在任何一个以 <span class="arithmatex">\(0\)</span> 或 <span class="arithmatex">\(1\)</span> 结尾的特殊子序列后面加上一个 <span class="arithmatex">\(1\)</span> 得到一个新的特殊子序列。因此 <span class="arithmatex">\(f[i][1] = f[i-1][0] + 2 \times f[i - 1][1]\)</span>。其余的 <span class="arithmatex">\(f[i][j]\)</span> 与 <span class="arithmatex">\(f[i-1][j]\)</span> 相等。</p>
91963+
<p>如果 <span class="arithmatex">\(nums[i] = 2\)</span>:如果我们不选择 <span class="arithmatex">\(nums[i]\)</span>,则 <span class="arithmatex">\(f[i][2] = f[i-1][2]\)</span>;如果我们选择 <span class="arithmatex">\(nums[i]\)</span>,那么 <span class="arithmatex">\(f[i][2]=f[i-1][2]+f[i-1][1]\)</span>,因为我们可以在任何一个以 <span class="arithmatex">\(1\)</span> 或 <span class="arithmatex">\(2\)</span> 结尾的特殊子序列后面加上一个 <span class="arithmatex">\(2\)</span> 得到一个新的特殊子序列。因此 <span class="arithmatex">\(f[i][2] = f[i-1][1] + 2 \times f[i - 1][2]\)</span>。其余的 <span class="arithmatex">\(f[i][j]\)</span> 与 <span class="arithmatex">\(f[i-1][j]\)</span> 相等。</p>
9196491964
<p>综上,我们可以得到如下的状态转移方程:</p>
9196591965
<div class="arithmatex">\[
9196691966
\begin{aligned}
9196791967
f[i][0] &amp;= 2 \times f[i - 1][0] + 1, \quad nums[i] = 0 \\
91968-
f[i][1] &amp;= f[i-1][1] + 2 \times f[i - 1][0], \quad nums[i] = 1 \\
91969-
f[i][2] &amp;= f[i-1][2] + 2 \times f[i - 1][1], \quad nums[i] = 2 \\
91968+
f[i][1] &amp;= f[i-1][0] + 2 \times f[i - 1][1], \quad nums[i] = 1 \\
91969+
f[i][2] &amp;= f[i-1][1] + 2 \times f[i - 1][2], \quad nums[i] = 2 \\
9197091970
f[i][j] &amp;= f[i-1][j], \quad nums[i] \neq j
9197191971
\end{aligned}
9197291972
\]</div>
9197391973
<p>最终的答案即为 <span class="arithmatex">\(f[n-1][2]\)</span>。</p>
9197491974
<p>时间复杂度 <span class="arithmatex">\(O(n)\)</span>,空间复杂度 <span class="arithmatex">\(O(n)\)</span>。其中 <span class="arithmatex">\(n\)</span> 是数组 <span class="arithmatex">\(nums\)</span> 的长度。</p>
91975-
<p>我们注意到,上述的状态转移方程中,<span class="arithmatex">\(f[i][j]\)</span> 的值仅与 <span class="arithmatex">\(f[i-1][j]\)</span> 有关,因此我们可以去掉第一维,将空间复杂度优化到 <span class="arithmatex">\(O(1)\)</span>。</p>
9197691975
<div class="tabbed-set tabbed-alternate" data-tabs="1:5"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Python3</label><label for="__tabbed_1_2">Java</label><label for="__tabbed_1_3">C++</label><label for="__tabbed_1_4">Go</label><label for="__tabbed_1_5">TypeScript</label></div>
9197791976
<div class="tabbed-content">
9197891977
<div class="tabbed-block">
@@ -92227,7 +92226,8 @@ <h3 id="_3">方法一:动态规划</h3>
9222792226

9222892227
<!-- solution:start -->
9222992228

92230-
<h3 id="_4">方法二</h3>
92229+
<h3 id="_4">方法二:动态规划(空间优化)</h3>
92230+
<p>我们注意到,上述的状态转移方程中,<span class="arithmatex">\(f[i][j]\)</span> 的值仅与 <span class="arithmatex">\(f[i-1][j]\)</span> 有关,因此我们可以去掉第一维,将空间复杂度优化到 <span class="arithmatex">\(O(1)\)</span>。</p>
9223192231
<div class="tabbed-set tabbed-alternate" data-tabs="2:5"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><input id="__tabbed_2_3" name="__tabbed_2" type="radio" /><input id="__tabbed_2_4" name="__tabbed_2" type="radio" /><input id="__tabbed_2_5" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">Python3</label><label for="__tabbed_2_2">Java</label><label for="__tabbed_2_3">C++</label><label for="__tabbed_2_4">Go</label><label for="__tabbed_2_5">TypeScript</label></div>
9223292232
<div class="tabbed-content">
9223392233
<div class="tabbed-block">

0 commit comments

Comments
 (0)