<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Array on 跟著 Desolve 學程式</title><link>https://desolve.pages.dev/tags/array/</link><description>Recent content in Array on 跟著 Desolve 學程式</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Sun, 30 Jan 2022 00:00:00 +0800</lastBuildDate><atom:link href="https://desolve.pages.dev/tags/array/index.xml" rel="self" type="application/rss+xml"/><item><title>從LeetCode學演算法 - 117 Array (17)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-117-array-17/</link><pubDate>Sun, 30 Jan 2022 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-117-array-17/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 117 Array (17)" /&gt;&lt;p&gt;&lt;strong&gt;0941. Valid Mountain Array (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="寫在前面"&gt;寫在前面
&lt;/h2&gt;&lt;p&gt;2022/03/09: 配合官方修改格式，各項優惠連結3/14之後會失效，&lt;br&gt;
這邊更新新版的連結給大家~**&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;從 LeetCode 學演算法｜完整解題技巧 + 面試成功指南：&lt;/strong&gt; &lt;a class="link" href="https://bit.ly/lc2022all" target="_blank" rel="noopener"
&gt;https://bit.ly/lc2022all&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;容筆者工商一下，&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」&lt;/strong&gt; 這次選了40道難度加深的LeetCode題目，&lt;br&gt;
同樣也會細部解說對應的技巧及須要掌握的演算法！&lt;br&gt;
同時這次購買進階篇的話，&lt;br&gt;
額外還加贈**「從Leetcode學演算法｜面試篇」** ！&lt;br&gt;
當中包含了&lt;strong&gt;面試準備須知分享&lt;/strong&gt; ，&lt;strong&gt;及訪談國內外不同經驗的工程師&lt;/strong&gt; ，&lt;br&gt;
讓你不論是&lt;strong&gt;想走前端/後端/一般軟工&lt;/strong&gt; 或者是&lt;strong&gt;想找國外的工作&lt;/strong&gt; ，&lt;br&gt;
是&lt;strong&gt;初學想轉職&lt;/strong&gt; 還是&lt;strong&gt;正在工作&lt;/strong&gt; ，都能夠從中得到收穫呦！&lt;br&gt;
有興趣的朋友可以使用下面的優惠～&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」+「從Leetcode學演算法｜面試篇」&lt;/strong&gt; ：&lt;br&gt;
&lt;a class="link" href="https://bit.ly/lc2022adv" target="_blank" rel="noopener"
&gt;https://bit.ly/lc2022adv&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given an array of integers &lt;code&gt;arr&lt;/code&gt;, return &lt;code&gt;true&lt;/code&gt; &lt;em&gt;if and only if it is a valid mountain array&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Recall that arr is a mountain array if and only if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;arr.length &amp;gt;= 3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;There exists some &lt;code&gt;i&lt;/code&gt; with &lt;code&gt;0 &amp;lt; i &amp;lt; arr.length - 1&lt;/code&gt; such that:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;arr[0] &amp;lt; arr[1] &amp;lt; ... &amp;lt; arr[i - 1] &amp;lt; arr[i]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;arr[i] &amp;gt; arr[i + 1] &amp;gt; ... &amp;gt; arr[arr.length - 1]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-117-array-17/0__l8cBax99BYE7Ikv.png"
width="800"
height="505"
srcset="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-117-array-17/0__l8cBax99BYE7Ikv_hu_604707149f58d753.png 480w, https://desolve.pages.dev/post/learn-algorithm-from-leetcode-117-array-17/0__l8cBax99BYE7Ikv_hu_6a3422b6370a2ae1.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="158"
data-flex-basis="380px"
&gt;&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: arr = [2,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: false
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: arr = [3,5,5]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: false
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-3"&gt;Example 3
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: arr = [0,3,2,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="constraints"&gt;Constraints
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= arr.length &amp;lt;= 104&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0 &amp;lt;= arr[i] &amp;lt;= 104&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個整數陣列arr，若且唯若它是一個合格的mountain array時，&lt;br&gt;
回傳true(否則回傳false)。&lt;br&gt;
mountain array的條件要符合以下幾點:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;arr長≥3&lt;/li&gt;
&lt;li&gt;存在i，0&amp;lt;i&amp;lt;arr.length-1使得:&lt;br&gt;
arr[0] &amp;lt; arr[1] &amp;lt; … &amp;lt; arr[i-1] &amp;lt; arr[i] 且&lt;br&gt;
arr[i] &amp;gt; arr[i + 1] &amp;gt; … &amp;gt; arr[arr.length-1]&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;為了避免大家隔太久沒有練習(我也是)，而且快過年了不要讓大家太燒腦，&lt;br&gt;
今天我們就介紹簡單一點的題目就好XD！&lt;/p&gt;
&lt;p&gt;在LeetCode的題型中，有一些簡單的題目的規格，&lt;br&gt;
會呈現為只要題目讀得懂，按要求做完就會答對的形式，&lt;br&gt;
本題就是相當明確的例子之一。&lt;/p&gt;
&lt;p&gt;我們來看看要求：mountain array&lt;br&gt;
前面必須要&lt;strong&gt;嚴格遞增&lt;/strong&gt; ，後面必須要&lt;strong&gt;嚴格遞減&lt;/strong&gt; ，&lt;br&gt;
中間的arr[i]值為整個陣列的最高點。&lt;br&gt;
同時限制了長度必須大於等於3，也就是上下坡都必然存在。&lt;/p&gt;
&lt;p&gt;那麼解題方式就很明確了：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先檢查長度是否≥3，且arr[0]是否小於arr[1]&lt;br&gt;
(一定要檢查，因為我們希望&lt;strong&gt;上下坡都存在&lt;/strong&gt; )&lt;/li&gt;
&lt;li&gt;從陣列的開頭開始以i計數，往後沿途比較arr[i]跟arr[i+1]，&lt;br&gt;
一路遞增到遞減轉折出現為止(也就是第一個arr[i] &amp;gt;arr[i+1])&lt;/li&gt;
&lt;li&gt;在2當中如果出現&lt;strong&gt;前後相等&lt;/strong&gt; 的狀況可直接回傳False，&lt;br&gt;
同時，如果&lt;strong&gt;還沒下坡就已經走到底(i + 1 == arr.length)&lt;/strong&gt; 的話，&lt;br&gt;
也要回傳&lt;strong&gt;False&lt;/strong&gt; 。&lt;/li&gt;
&lt;li&gt;沿路下坡，一路走到尾端&lt;/li&gt;
&lt;li&gt;如果沿途均符合的話(會走到&lt;strong&gt;i + 1 == arr.length&lt;/strong&gt; )，則回傳true；&lt;br&gt;
如果沿途變平或上坡的話，需在4的位置提早停下，&lt;br&gt;
這樣子就可以藉由是否走到尾端這點來判斷要回傳true或false。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;依此，寫成程式碼如下。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;p&gt;可以看到我們在上坡的時候使用迴圈，&lt;br&gt;
每次檢查就做兩件事來確認是否離開迴圈：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;是不是走到底了 -&amp;gt; 走到底的話就不對了，因為還沒下坡&lt;/li&gt;
&lt;li&gt;是不是有在走上坡 -&amp;gt; 變平的話不對，只有變下坡可以接受&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;而下坡時只有一路下坡走到底可以被接受。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/2e0e87626e17ebc1f4729134c817fd7e.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;Python寫法基本上一致，所以說這題不難，對吧XD！&lt;br&gt;
關鍵還是在於是否能確切釐清題目要求，&lt;br&gt;
例如如果沒有寫A[0] ≥ A[1]的檢查的話，&lt;br&gt;
就有可能碰到只有下坡的陣列，從而讓檢查結果出問題喲！&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/81650fdb8adc9337e9ebe7f963469467.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(1)，這題最多需要掃完整個陣列，&lt;br&gt;
且我們只有多使用一個i的變數。)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;p&gt;想看看其他題目嗎？&lt;br&gt;
歡迎從&lt;a class="link" href="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-0/" &gt;&lt;strong&gt;第零篇&lt;/strong&gt; &lt;/a&gt;找你想要的！&lt;/p&gt;
&lt;p&gt;同時追蹤粉專以獲得更多新文章的通知：&lt;br&gt;
&lt;a class="link" href="https://www.facebook.com/learnwithdesolve" target="_blank" rel="noopener"
&gt;&lt;strong&gt;跟著Desolve學程式&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;另外，&lt;strong&gt;「從Leetcode學演算法｜基礎篇」&lt;/strong&gt; 已經回原價囉，&lt;br&gt;
先前的優惠碼會失效，但這邊仍然為讀者保留了300塊的折抵，&lt;br&gt;
雖然&lt;strong&gt;整捆一起買總體比較划算&lt;/strong&gt; (差290而已就有整組了阿XD)，&lt;br&gt;
如果你還是想先試試基礎課的話，&lt;br&gt;
&lt;strong&gt;300元折抵的連結&lt;/strong&gt; 在這邊：&lt;br&gt;
&lt;a class="link" href="https://bit.ly/lc2022base" target="_blank" rel="noopener"
&gt;https://bit.ly/lc2022base&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 110 Array (16) / Greedy Algorithm (1)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-110-array-16-greedy-algorithm-1/</link><pubDate>Sun, 17 Jan 2021 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-110-array-16-greedy-algorithm-1/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 110 Array (16) / Greedy Algorithm (1)" /&gt;&lt;p&gt;&lt;strong&gt;0881. Boats to Save People (Medium)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="寫在前面"&gt;寫在前面
&lt;/h2&gt;&lt;p&gt;目前&lt;strong&gt;0元挑戰賽&lt;/strong&gt; 的活動已經開始囉！&lt;br&gt;
只要&lt;strong&gt;修課後三個月內完課且成功錄取新工作並撰寫心得，&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;課程就會全額退費喲！請使用下面連結看更詳細的規則說明：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;零元求職挑戰賽 Python 組｜從 LeetCode 學演算法 + 面試成功指南&lt;/strong&gt; &lt;a class="link" href="https://bit.ly/zeroclg?fbclid=IwAR0cGOc6L5R4j26i6BqncG0m1tPPPx5-Z1M0vAOzJpnwUrByX3q-gWE1Sfw" target="_blank" rel="noopener"
&gt;http://bit.ly/zeroclg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;抽獎活動還在繼續累積人數(現在好像沒有人想抽XD)&lt;br&gt;
在&lt;a class="link" href="https://www.facebook.com/groups/pythontw/permalink/10160354153893438/" target="_blank" rel="noopener"
&gt;&lt;strong&gt;Python Taiwan的連結第100篇的文章&lt;/strong&gt; &lt;/a&gt;底下，&lt;br&gt;
&lt;strong&gt;公開分享到你的臉書、按讚該篇文章、並留言告訴我說，&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;「你最喜歡這一整個系列的哪一篇？為什麼？」或&lt;br&gt;
「除了從LeetCode學演算法系列以外，&lt;br&gt;
你還想要看到關於什麼方向的文章？」&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;超過20則留言的話&lt;/strong&gt; (有完成以上步驟的才算)，我們就抽一組&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」+「從Leetcode學演算法｜面試篇」&lt;br&gt;
課程的免費兌換券進行贈送！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;期限嘛…就延長到滿人數吧XDD (不然也沒辦法哈哈)&lt;/p&gt;
&lt;p&gt;容筆者工商一下，&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」&lt;/strong&gt; 開放預購啦！&lt;br&gt;
這次選了40道難度加深的LeetCode題目，&lt;br&gt;
同樣也會細部解說對應的技巧及須要掌握的演算法！&lt;br&gt;
同時這次購買進階篇的話，&lt;br&gt;
額外還加贈**「從Leetcode學演算法｜面試篇」** ！&lt;br&gt;
當中包含了&lt;strong&gt;面試準備須知分享&lt;/strong&gt; ，&lt;strong&gt;及訪談國內外不同經驗的工程師&lt;/strong&gt; ，&lt;br&gt;
讓你不論是&lt;strong&gt;想走前端/後端/一般軟工&lt;/strong&gt; 或者是&lt;strong&gt;想找國外的工作&lt;/strong&gt; ，&lt;br&gt;
是&lt;strong&gt;初學想轉職&lt;/strong&gt; 還是&lt;strong&gt;正在工作&lt;/strong&gt; ，都能夠從中得到收穫呦！&lt;br&gt;
有興趣的朋友可以使用下面的早鳥優惠～&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」+「從Leetcode學演算法｜面試篇」&lt;/strong&gt; ：&lt;br&gt;
&lt;a class="link" href="https://bit.ly/leetcodeadv" target="_blank" rel="noopener"
&gt;https://bit.ly/leetcodeadv&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;i&lt;/code&gt;-th person has weight &lt;code&gt;people[i]&lt;/code&gt;, and each boat can carry a maximum weight of &lt;code&gt;limit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Each boat carries at most 2 people at the same time, provided the sum of the weight of those people is at most &lt;code&gt;limit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Return the minimum number of boats to carry every given person. (It is guaranteed each person can be carried by a boat.)&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: people = [1,2], limit = 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: 1 boat (1, 2)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: people = [3,2,2,1], limit = 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: 3 boats (1, 2), (2) and (3)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-3"&gt;Example 3
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: people = [3,5,3,4], limit = 5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: 4 boats (3), (3), (4), (5)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= people.length &amp;lt;= 50000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= people[i] &amp;lt;= limit &amp;lt;= 30000&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;有一群人people，當中第i個人的重量是people[i]，&lt;br&gt;
且每艘船最重可以載重limit，同時最多只能乘載2個人，&lt;br&gt;
乘載的重量最多為limit(剛好的話也可以)&lt;br&gt;
試計算並回傳最少所需裝載所有人的船的數量。&lt;/p&gt;
&lt;p&gt;乍看之下，這題是不是有點像以前的Two Sum?&lt;br&gt;
但再仔細想想，就會發現，&lt;br&gt;
由於我們並不一定要每艘船都裝載到limit的重量，&lt;br&gt;
所以並不能夠形成相加等於特定和的關係。&lt;/p&gt;
&lt;p&gt;那麼該怎麼處理呢？&lt;br&gt;
如果這群人是由小到大排列的話，&lt;br&gt;
不管如何最重的那些人都還是要上船，&lt;br&gt;
所以我們先挑最右邊的(最重的人)上船。&lt;br&gt;
接下來這艘船還能不能帶人呢？&lt;br&gt;
我們就再幫忙找最左邊的(最輕的人)看能不能湊一組，&lt;br&gt;
可以湊就沒問題，不能湊也無法強求，就只好讓這個人自己一條船囉！&lt;br&gt;
這樣搭配下，我們就可以盡可能先幫較重的人找看看能不能組起來，&lt;br&gt;
因此會是所需求的船隻數量會是最小的。&lt;/p&gt;
&lt;p&gt;上面這樣子的概念，被稱為&lt;strong&gt;貪婪演算法(Greedy Algorithm)&lt;/strong&gt; 。&lt;br&gt;
貪婪演算法的核心精神，在於先找到一個方法，&lt;br&gt;
使得每次盡可能都處理所有可以操作的單位，&lt;br&gt;
再依序往下做處理，這樣的方法是&lt;strong&gt;對總體來說也是最佳&lt;/strong&gt; 的時候，&lt;br&gt;
就符合貪婪演算法的特性。&lt;br&gt;
請讀者務必留意，&lt;br&gt;
如果像是&lt;strong&gt;動態規劃(Dynamic Programming)&lt;/strong&gt; 這類型的問題，&lt;br&gt;
就顯然&lt;strong&gt;不會符合&lt;/strong&gt; 貪婪演算法的作法，&lt;br&gt;
因為&lt;strong&gt;局部的最佳解，不見得會是全局的最佳解&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;所以對這題來說，當我們排序完這群人以後，&lt;br&gt;
從最重的開始盡可能幫其安排組合，對總體來說就會是最好的。&lt;/p&gt;
&lt;p&gt;因此，我們的大體解法應該如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先將people由小到大排序&lt;/li&gt;
&lt;li&gt;令&lt;strong&gt;l = 0, r = people.length - 1, res = 0 (用來記錄需要幾艘船)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;使用一個迴圈，當 &lt;strong&gt;l ≤ r&lt;/strong&gt; 時，進行以下操作：&lt;br&gt;
3–1. 如果 &lt;strong&gt;people[l]+people[r]&amp;lt;= limit&lt;/strong&gt; 時，&lt;br&gt;
代表可以捎上&lt;strong&gt;index l&lt;/strong&gt; 的人，此時將** l&lt;strong&gt;遞增。&lt;br&gt;
3–2. 由於&lt;/strong&gt;所有人的重量都一定小於limit** ，(題目說的)&lt;br&gt;
所以&lt;strong&gt;people[r]一定可以占一艘船&lt;/strong&gt; (不管people[l]有沒有上船)，&lt;br&gt;
所以我們將&lt;strong&gt;r遞減&lt;/strong&gt; ，並且將&lt;strong&gt;res遞增&lt;/strong&gt; ，這艘船我們就處理完囉！&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回傳res&lt;/strong&gt; 即為答案。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;讀者可能會問：咦？那&lt;strong&gt;l和r重疊&lt;/strong&gt; 的話怎麼辦？&lt;br&gt;
問得好！重疊的話，由於不論怎麼樣r都會遞減，&lt;br&gt;
所以重疊的時候，事實上就是相&lt;strong&gt;當於3–1沒有任何作用&lt;/strong&gt; ，&lt;br&gt;
但並沒有影響到我們要計算的res，對吧XD？&lt;/p&gt;
&lt;p&gt;依此，寫成程式碼如下：&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;p&gt;Java的話使用Arrays.sort()，&lt;br&gt;
其他部分應該相當直觀。&lt;br&gt;
這裡提供LeetCode的另一種解法，&lt;br&gt;
由於有limit的限制，所以我們可以利用長度為limit+1的陣列，&lt;br&gt;
來達到排序的效果(這相當於O(limit)的空間去換取時間複雜度降低)&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/c17604819bd171671e5a4a3cd1dc299c.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;Python的排序則直接對串列進行.sort()即可，&lt;br&gt;
讀者請記得sorted()函式是產生一個新的排序的串列，別搞混喲！&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/c315324b270acabd8a584d6b8554adf8.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(NlogN)/O(1)，N為people的長度。&lt;br&gt;
如果是使用Java附上的參考解的話則是O(limit)/O(limit))&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;p&gt;想看看其他題目嗎？&lt;br&gt;
歡迎從&lt;a class="link" href="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-0/" &gt;&lt;strong&gt;第零篇&lt;/strong&gt; &lt;/a&gt;找你想要的！&lt;/p&gt;
&lt;p&gt;同時追蹤粉專以獲得更多新文章的通知：&lt;br&gt;
&lt;a class="link" href="https://www.facebook.com/learnwithdesolve" target="_blank" rel="noopener"
&gt;&lt;strong&gt;跟著Desolve學程式&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;另外，&lt;strong&gt;「從Leetcode學演算法｜基礎篇」&lt;/strong&gt; 已經回原價囉，&lt;br&gt;
先前的優惠碼會失效，但這邊仍然為讀者保留了300塊的折抵，&lt;br&gt;
雖然&lt;strong&gt;整捆一起買總體比較划算&lt;/strong&gt; (差290而已就有整組了阿XD)，&lt;br&gt;
如果你還是想先試試基礎課的話，&lt;br&gt;
&lt;strong&gt;300元折抵的連結&lt;/strong&gt; 在這邊：&lt;br&gt;
&lt;a class="link" href="https://bit.ly/1desolve" target="_blank" rel="noopener"
&gt;https://bit.ly/1desolve&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 109 Array (15) / Hash Table (11)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-109-array-15-hash-table-11/</link><pubDate>Fri, 08 Jan 2021 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-109-array-15-hash-table-11/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 109 Array (15) / Hash Table (11)" /&gt;&lt;p&gt;&lt;strong&gt;1640. Check Array Formation Through Concatenation (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="寫在前面"&gt;寫在前面
&lt;/h2&gt;&lt;p&gt;好久不見！筆者最近剛換了工作，&lt;br&gt;
所以比較忙一點XD &lt;strong&gt;之後1月中會有HiSKIO 技術年貨節的活動，&lt;br&gt;
歡迎大家拿著折價券來修從LeetCode學演算法的課程喲！&lt;br&gt;
如果預算不夠，相信這108篇也還是很夠讀者練習的啦XDD&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在更之後還有規劃0元挑戰賽的部分，&lt;br&gt;
只要&lt;strong&gt;修課後一定時間內成功錄取新工作&lt;/strong&gt; ，&lt;br&gt;
&lt;strong&gt;課程就會全額退費喲！&lt;/strong&gt; 這部分再請留意官方那邊的公告，&lt;br&gt;
如果有開始的話，文章中也會再提醒各位。&lt;/p&gt;
&lt;p&gt;抽獎活動還在繼續累積人數(現在好像沒有人想抽XD)&lt;br&gt;
在&lt;a class="link" href="https://www.facebook.com/groups/pythontw/permalink/10160354153893438/" target="_blank" rel="noopener"
&gt;&lt;strong&gt;Python Taiwan的連結第100篇的文章&lt;/strong&gt; &lt;/a&gt;底下，&lt;br&gt;
&lt;strong&gt;公開分享到你的臉書、按讚該篇文章、並留言告訴我說，&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;「你最喜歡這一整個系列的哪一篇？為什麼？」或&lt;br&gt;
「除了從LeetCode學演算法系列以外，&lt;br&gt;
你還想要看到關於什麼方向的文章？」&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;超過20則留言的話&lt;/strong&gt; (有完成以上步驟的才算)，我們就抽一組&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」+「從Leetcode學演算法｜面試篇」&lt;br&gt;
課程的免費兌換券進行贈送！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;期限嘛…就延長到滿人數吧XDD (不然也沒辦法哈哈)&lt;/p&gt;
&lt;p&gt;容筆者工商一下，&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」&lt;/strong&gt; 開放預購啦！&lt;br&gt;
這次選了40道難度加深的LeetCode題目，&lt;br&gt;
同樣也會細部解說對應的技巧及須要掌握的演算法！&lt;br&gt;
同時這次購買進階篇的話，&lt;br&gt;
額外還加贈**「從Leetcode學演算法｜面試篇」** ！&lt;br&gt;
當中包含了&lt;strong&gt;面試準備須知分享&lt;/strong&gt; ，&lt;strong&gt;及訪談國內外不同經驗的工程師&lt;/strong&gt; ，&lt;br&gt;
讓你不論是&lt;strong&gt;想走前端/後端/一般軟工&lt;/strong&gt; 或者是&lt;strong&gt;想找國外的工作&lt;/strong&gt; ，&lt;br&gt;
是&lt;strong&gt;初學想轉職&lt;/strong&gt; 還是&lt;strong&gt;正在工作&lt;/strong&gt; ，都能夠從中得到收穫呦！&lt;br&gt;
有興趣的朋友可以使用下面的早鳥優惠～&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」+「從Leetcode學演算法｜面試篇」&lt;/strong&gt; ：&lt;br&gt;
&lt;a class="link" href="https://bit.ly/leetcodeadv" target="_blank" rel="noopener"
&gt;https://bit.ly/leetcodeadv&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「從Leetcode學演算法」全套(基礎/進階/面試篇)同捆優惠：&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://bit.ly/leetcodeall" target="_blank" rel="noopener"
&gt;https://bit.ly/leetcodeall&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;You are given an array of &lt;strong&gt;distinct&lt;/strong&gt; integers &lt;code&gt;arr&lt;/code&gt; and an array of integer arrays &lt;code&gt;pieces&lt;/code&gt;, where the integers in &lt;code&gt;pieces&lt;/code&gt; are ** distinct**. Your goal is to form &lt;code&gt;arr&lt;/code&gt; by concatenating the arrays in &lt;code&gt;pieces&lt;/code&gt; ** in any order**. However, you are ** not** allowed to reorder the integers in each array &lt;code&gt;pieces[i]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Return &lt;code&gt;true&lt;/code&gt; &lt;em&gt;if it is possible to form the array&lt;/em&gt; &lt;code&gt;arr&lt;/code&gt; &lt;em&gt;from&lt;/em&gt; &lt;code&gt;pieces&lt;/code&gt;. Otherwise, return &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: arr = [85], pieces = [[85]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: arr = [15,88], pieces = [[88],[15]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: Concatenate [15] then [88]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-3"&gt;Example 3
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: arr = [49,18,16], pieces = [[16,18,49]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: Even though the numbers match, we cannot reorder pieces[0].
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-4"&gt;Example 4
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: arr = [91,4,64,78], pieces = [[78],[4,64],[91]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: Concatenate [91] then [4,64] then [78]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-5"&gt;Example 5
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: arr = [1,3,5,7], pieces = [[2,4,6,8]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: false
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="constraints"&gt;Constraints
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= pieces.length &amp;lt;= arr.length &amp;lt;= 100&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sum(pieces[i].length) == arr.length&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= pieces[i].length &amp;lt;= arr.length&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= arr[i], pieces[i][j] &amp;lt;= 100&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The integers in &lt;code&gt;arr&lt;/code&gt; are &lt;strong&gt;distinct&lt;/strong&gt; .&lt;/li&gt;
&lt;li&gt;The integers in &lt;code&gt;pieces&lt;/code&gt; are &lt;strong&gt;distinct&lt;/strong&gt; (i.e., If we flatten pieces in a 1D array, all the integers in this array are distinct).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個陣列arr，當中有不同的整數們，&lt;br&gt;
以及另一個整數陣列的陣列pieces(好饒口XD)，&lt;br&gt;
當中所有的pieces中的整數也都是相異的，&lt;br&gt;
我們的目標就是要將pieces拼接成arr，&lt;br&gt;
但pieces中要怎麼接順序都沒關係，&lt;br&gt;
&lt;strong&gt;但每一個pieces中的子陣列中的順序不可以被調換&lt;/strong&gt; 。&lt;br&gt;
(例如arr = [15,88], pieces = [[88],[15]]，&lt;br&gt;
可以先拚[15]再拚[88]從而組出arr，可回傳true；&lt;br&gt;
但arr = [49,18,16], pieces = [[16,18,49]]的話，&lt;br&gt;
因為[16,18,49]內不能夠調換順序，所以只能回傳false)&lt;/p&gt;
&lt;p&gt;如果拚得起來就回傳true，否則回傳false。&lt;/p&gt;
&lt;p&gt;條件限制：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;arr的長度和pieces的長度均為1~100之間(後者小於前者)。&lt;/li&gt;
&lt;li&gt;pieces的所有子陣列長度總和，和arr陣列長度相等。&lt;/li&gt;
&lt;li&gt;arr和pieces的所有子陣列中的元素值均在1~100之間。&lt;/li&gt;
&lt;li&gt;arr中的所有整數均為相異。&lt;/li&gt;
&lt;li&gt;pieces中的所有整數均為相異。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;根據條件限制的部分，我們可以簡單得到，&lt;br&gt;
反正要能對上的話，因為總個數剛好相等，&lt;br&gt;
所以&lt;strong&gt;不存在第二種對應方式&lt;/strong&gt; ！&lt;br&gt;
既然不存在第二種對應的方式，&lt;br&gt;
那麼我們在arr中看到一個開頭時，&lt;br&gt;
我們應該只要&lt;strong&gt;在pieces中找那個值&lt;/strong&gt; ，&lt;br&gt;
就知道該對上pieces中的那一個子陣列囉！&lt;/p&gt;
&lt;p&gt;那麼，我們該怎麼樣去找對應呢？&lt;br&gt;
每次都掃過一輪去找，時間複雜度感覺會很糟糕，&lt;br&gt;
那麼，想要迅速的找到對應的位置，&lt;br&gt;
我們就會想到利用HashTable的概念。&lt;br&gt;
因此，在Java使用HashMap，Python中則使用dictionary，&lt;br&gt;
就可以讓我們使用O(1)的複雜度進行存取(不過前面要先花O(N)來存喲！)&lt;/p&gt;
&lt;p&gt;這邊我們可以選擇將每個(pieces[i][0], i)的對應存入，&lt;br&gt;
這樣在搜尋時，我們就知道接下來要拚入哪一組子陣列囉！&lt;/p&gt;
&lt;p&gt;接著我們需要遍歷整個arr，&lt;br&gt;
每次先拿第一個值去搜尋到對應的pieces，&lt;br&gt;
接著依序一個一個去對照兩邊的值是否相等。&lt;br&gt;
如果找不到對應或者是值不相等，就表示無法對應成功囉！&lt;br&gt;
(可以直接回傳false)&lt;br&gt;
如果全數拚完都沒問題，自然就可以回傳true。&lt;/p&gt;
&lt;p&gt;依此，寫成程式碼如下：&lt;/p&gt;
&lt;h3 id="java-java的部分我們使用hashmap來記錄"&gt;Java Java的部分，我們使用HashMap來記錄，
&lt;/h3&gt;&lt;p&gt;記得使用&lt;strong&gt;put(key, value)&lt;/strong&gt; 的形式！&lt;br&gt;
(因為沒有重複的問題，所以也不需要檢查)&lt;/p&gt;
&lt;p&gt;接著我們利用cnt來進行遍歷的紀錄，&lt;br&gt;
這邊&lt;strong&gt;不要忘記先檢查&lt;/strong&gt; 能不能找到arr[cnt]啊！&lt;br&gt;
(因為有可能找不到，直接用get會有exception的！)&lt;br&gt;
另外，由於get出來是Integer，&lt;br&gt;
這邊我們&lt;strong&gt;使用(int)來將其轉型回一般的int&lt;/strong&gt; 。&lt;br&gt;
其他就依序處理即可。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/05f2cd5f34d32264fdc74ae1dac90d65.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;Python的部分，字典和list的操作方式差不多，&lt;br&gt;
不過還是不要忘記先檢查喲！&lt;br&gt;
另外對初學的讀者提醒一下，&lt;br&gt;
&lt;strong&gt;Python中沒有++或&amp;ndash;這種方便的遞增/遞減方式&lt;/strong&gt; ，&lt;br&gt;
所以請乖乖使用&lt;strong&gt;cnt += 1或cnt = cnt + 1&lt;/strong&gt; 。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/d7ca363defdd266301bc5f37e956e7d4.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(pieces的子陣列個數，最大為N))&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;p&gt;想看看其他題目嗎？&lt;br&gt;
歡迎從&lt;a class="link" href="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-0/" &gt;&lt;strong&gt;第零篇&lt;/strong&gt; &lt;/a&gt;找你想要的！&lt;/p&gt;
&lt;p&gt;同時追蹤粉專以獲得更多新文章的通知：&lt;br&gt;
&lt;a class="link" href="https://www.facebook.com/learnwithdesolve" target="_blank" rel="noopener"
&gt;&lt;strong&gt;跟著Desolve學程式&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;另外，&lt;strong&gt;「從Leetcode學演算法｜基礎篇」&lt;/strong&gt; 已經回原價囉，&lt;br&gt;
先前的優惠碼會失效，但這邊仍然為讀者保留了300塊的折抵，&lt;br&gt;
雖然&lt;strong&gt;整捆一起買總體比較划算&lt;/strong&gt; (差290而已就有整組了阿XD)，&lt;br&gt;
如果你還是想先試試基礎課的話，&lt;br&gt;
&lt;strong&gt;300元折抵的連結&lt;/strong&gt; 在這邊：&lt;br&gt;
&lt;a class="link" href="https://bit.ly/1desolve" target="_blank" rel="noopener"
&gt;https://bit.ly/1desolve&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 75 Array (14)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-75-array-14/</link><pubDate>Thu, 19 Dec 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-75-array-14/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 75 Array (14)" /&gt;&lt;p&gt;&lt;strong&gt;0289. Game of Life (Medium)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;According to the &lt;a class="link" href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life" target="_blank" rel="noopener"
&gt;Wikipedia’s article&lt;/a&gt;: “The &lt;strong&gt;Game of Life&lt;/strong&gt; , also known simply as &lt;strong&gt;Life&lt;/strong&gt; , is a cellular automaton devised by the British mathematician John Horton Conway in 1970.”&lt;/p&gt;
&lt;p&gt;Given a &lt;em&gt;board&lt;/em&gt; with &lt;em&gt;m&lt;/em&gt; by &lt;em&gt;n&lt;/em&gt; cells, each cell has an initial state &lt;em&gt;live&lt;/em&gt; (1) or &lt;em&gt;dead&lt;/em&gt; (0). Each cell interacts with its &lt;a class="link" href="https://en.wikipedia.org/wiki/Moore_neighborhood" target="_blank" rel="noopener"
&gt;eight neighbors&lt;/a&gt; (horizontal, vertical, diagonal) using the following four rules (taken from the above Wikipedia article):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Any live cell with fewer than two live neighbors dies, as if caused by under-population.&lt;/li&gt;
&lt;li&gt;Any live cell with two or three live neighbors lives on to the next generation.&lt;/li&gt;
&lt;li&gt;Any live cell with more than three live neighbors dies, as if by over-population..&lt;/li&gt;
&lt;li&gt;Any dead cell with exactly three live neighbors becomes a live cell, as if by reproduction.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Write a function to compute the next state (after one update) of the board given its current state. The next state is created by applying the above rules simultaneously to every cell in the current state, where births and deaths occur simultaneously.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [0,1,0],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [0,0,1],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [1,1,1],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [0,0,0]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [0,0,0],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [1,0,1],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [0,1,1],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [0,1,0]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Follow up&lt;/strong&gt; :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Could you solve it in-place? Remember that the board needs to be updated at the same time: You cannot update some cells first and then use their updated values to update other cells.&lt;/li&gt;
&lt;li&gt;In this question, we represent the board using a 2D array. In principle, the board is infinite, which would cause problems when the active area encroaches the border of the array. How would you address these problems?&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;這題是典型的&lt;a class="link" href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life" target="_blank" rel="noopener"
&gt;&lt;strong&gt;生命遊戲&lt;/strong&gt; &lt;/a&gt;題目。生命遊戲一般是透過2D的棋盤式的格子，&lt;br&gt;
上面以1代表活著的細胞，0代表死去的細胞，&lt;br&gt;
透過設定好的規則來觀察其演化的狀況。&lt;br&gt;
設定這些東西的目的最初應該是為了要產生模擬圖靈機，&lt;br&gt;
後來發現一些有趣的現象，比如能穩定周期性的圖案像是滑翔機、&lt;br&gt;
機關槍等等，也有的看似是有周期的但最後會消滅的狀況，&lt;br&gt;
總之某種層面上有點像是可以拿來模擬族群聚落的演進等狀態就是了，&lt;br&gt;
有興趣的讀者可以再看看相關的資料。&lt;/p&gt;
&lt;p&gt;回到題目，基本上生命遊戲裡面的每個單位，&lt;br&gt;
在下一個時間點要嘛是1(活著)，不然就是0(死去)。&lt;br&gt;
典型的規則是看其九宮格的周圍：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;如果原本自己是&lt;strong&gt;1(活著)&lt;/strong&gt; 的話，只有周圍有&lt;strong&gt;2~3個&lt;/strong&gt; 鄰居(活著的細胞)，&lt;br&gt;
下一刻自己才會繼續存活，否則就會死去。&lt;br&gt;
(&lt;strong&gt;只有1個鄰居以下會因人口過少而死，&lt;br&gt;
而超過3個鄰居會因人口過多而死&lt;/strong&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果原本自己是&lt;strong&gt;0(死去)&lt;/strong&gt; 的話，只有周圍&lt;strong&gt;恰好有3個鄰居&lt;/strong&gt; ，&lt;br&gt;
下一刻自己會變成&lt;strong&gt;1(活著)&lt;/strong&gt; (視作被繁衍出來的後代)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Follow up有兩點，1是詢問是否能in-place解題，&lt;br&gt;
2是棋盤是無窮大的話該怎麼描述問題。&lt;/p&gt;
&lt;p&gt;這個題目其實看懂定義的話並不困難，只是繁瑣而已。&lt;br&gt;
首先有一個重點是：更新的時候必須要一口氣一起更新，&lt;br&gt;
因為每個細胞的變化都需要看周圍的細胞，不同時改變的話，&lt;br&gt;
結果就有可能會出錯。這邊有兩種考慮方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;開一個跟board一樣大的二維陣列(串列)，&lt;br&gt;
記錄下一刻的狀態，最後再進行替換。&lt;/li&gt;
&lt;li&gt;想辦法&lt;strong&gt;用原有的board&lt;/strong&gt; 來進行記錄。&lt;br&gt;
我們這邊因為希望達成in-place，所以自然選擇2。&lt;br&gt;
還記得之前我們提過的word search嗎？&lt;br&gt;
我們利用了沒有被用到的位元做為遮罩進行XOR，&lt;br&gt;
使得visited的資訊用原先的棋盤就可以做記錄了；&lt;br&gt;
這邊比之前還要簡單，我們只要拿&lt;strong&gt;2的1次方位&lt;/strong&gt; 來記錄即可，&lt;br&gt;
因為&lt;strong&gt;board一開始只用到1和0而已&lt;/strong&gt; ，所以判斷完以後，&lt;br&gt;
&lt;strong&gt;如果它會變成存活的狀態，則將該值加上2，&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;死去的話則不用額外動作。&lt;/strong&gt;&lt;br&gt;
這樣一來，最後我們只要&lt;strong&gt;將整個board除以2取整數&lt;/strong&gt; ，&lt;br&gt;
就可以得到新的棋盤狀態了！&lt;br&gt;
中間在進行周圍八格的判斷時，不要忘記要&lt;strong&gt;除以2取餘數&lt;/strong&gt; 。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以總體會像這樣：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;遍歷整個棋盤做check&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;check&lt;/strong&gt; 函式中:&lt;br&gt;
 a. 依次檢查是否存活(alive)，並&lt;strong&gt;加總&lt;/strong&gt; 周圍八格的存活細胞數量&lt;br&gt;
 b. 若&lt;strong&gt;本身當前存活&lt;/strong&gt; -&amp;gt; 檢查** 周圍存活數&lt;strong&gt;是&lt;/strong&gt; 2或3&lt;strong&gt;時，&lt;/strong&gt; 將自己加上2**&lt;br&gt;
 c. 否則(&lt;strong&gt;本身死亡&lt;/strong&gt; )，若&lt;strong&gt;周圍存活數&lt;/strong&gt; 是&lt;strong&gt;3&lt;/strong&gt; ，&lt;strong&gt;將自己加上2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;alive&lt;/strong&gt; 函式中:&lt;br&gt;
 a. 若&lt;strong&gt;超出邊界則回傳0&lt;/strong&gt;&lt;br&gt;
 b. 否則回傳&lt;strong&gt;該格數值除以2的餘數&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;全數檢查完後呼叫&lt;strong&gt;next&lt;/strong&gt; 函式更新狀態&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;next&lt;/strong&gt; 函式: 遍歷整個棋盤，將&lt;strong&gt;值除以2取整數&lt;/strong&gt; 。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一般典型的話理論上邊界應該要互相連接，&lt;br&gt;
(走到最底會通往最上面，走到最右邊會連通最左邊)&lt;br&gt;
但我們這邊就不考慮這個問題了。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;p&gt;Java的部分，計算八方向我們使用了一個d(direction)的二維陣列來記錄，&lt;br&gt;
除了邊界條件以外沒有特別需要注意的地方。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/96f31a039e6bc3b800de6d439bbc3b0a.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;Python的部分，d的方面我們可以用&lt;strong&gt;list comprehension&lt;/strong&gt; ，&lt;br&gt;
扣掉自身(0, 0)來建構。除了留意子函式的定義，&lt;br&gt;
要在拿來做為&lt;strong&gt;global的部分後面(才能拿來用)&lt;/strong&gt; ，&lt;br&gt;
在&lt;strong&gt;呼叫之前(因為是腳本執行)&lt;/strong&gt; 以外，&lt;br&gt;
其他沒有什麼特別的地方XD&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/db3c16998ccc01aadab7d7ccd8f9687d.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(m * n), O(1))&lt;/p&gt;
&lt;p&gt;「如果棋盤無限大？」&lt;br&gt;
(那應該要找出一個pattern來表示它才對，&lt;br&gt;
不可能真的開出一個無限大的棋盤)&lt;/p&gt;
&lt;p&gt;「首尾相接的話？」&lt;br&gt;
(Python直接按照負數index會發生的事情處理，&lt;br&gt;
Java要自己計算過界的狀況)&lt;/p&gt;
&lt;p&gt;「還能簡化嗎？」&lt;br&gt;
(理論上相鄰的兩個點會&lt;strong&gt;共用到4個鄰居點&lt;/strong&gt; ，&lt;br&gt;
應該可以再節省一點計算時間，&lt;strong&gt;但時間複雜度是一樣的&lt;/strong&gt; )&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;p&gt;感謝大家對這系列文章的支持！這邊跟大家自我工商一下：&lt;/p&gt;
&lt;p&gt;筆者開設的系列同名線上課程：&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜基礎篇」已經上線啦！&lt;/strong&gt; 在這堂課中，你將學會利用十種演算法/資料結構來優化解題過程，&lt;br&gt;
並實際完整練習&lt;strong&gt;20題&lt;/strong&gt; 精選考古題，&lt;br&gt;
進而逐漸提升到不需提示也可以突破白板題，取得工作門票！&lt;br&gt;
&lt;strong&gt;第二階段Medium優惠(額滿即截止)：&lt;/strong&gt; &lt;a class="link" href="https://hiskio.com/courses/319?promo_code=VEQZV7E" target="_blank" rel="noopener"
&gt;https://hiskio.com/courses/319?promo_code=VEQZV7E&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 65 Array (13)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-65-array-13/</link><pubDate>Mon, 28 Oct 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-65-array-13/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 65 Array (13)" /&gt;&lt;p&gt;&lt;strong&gt;0926. Flip String to Monotone Increasing (Medium)&lt;/strong&gt;&lt;/p&gt;
&lt;ol start="926"&gt;
&lt;li&gt;Flip String to Monotone Increasing (Easy)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;A string of &lt;code&gt;'0'&lt;/code&gt;s and &lt;code&gt;'1'&lt;/code&gt;s is &lt;em&gt;monotone increasing&lt;/em&gt; if it consists of some number of &lt;code&gt;'0'&lt;/code&gt;s (possibly 0), followed by some number of &lt;code&gt;'1'&lt;/code&gt;s (also possibly 0.)&lt;/p&gt;
&lt;p&gt;We are given a string &lt;code&gt;S&lt;/code&gt; of &lt;code&gt;'0'&lt;/code&gt;s and &lt;code&gt;'1'&lt;/code&gt;s, and we may flip any &lt;code&gt;'0'&lt;/code&gt; to a &lt;code&gt;'1'&lt;/code&gt; or a &lt;code&gt;'1'&lt;/code&gt; to a &lt;code&gt;'0'&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Return the minimum number of flips to make &lt;code&gt;S&lt;/code&gt; monotone increasing.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: &amp;#34;00110&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: We flip the last digit to get 00111.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: &amp;#34;010110&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: We flip to get 011111, or alternatively 000111.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-3"&gt;Example 3
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: &amp;#34;00011000&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: We flip to get 00000000.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;一個只含'0&amp;rsquo;和'1&amp;rsquo;的字串在以下的狀況成立時會被視為&lt;strong&gt;單調遞增&lt;/strong&gt; ：&lt;br&gt;
數個'0&amp;rsquo;作為開頭(也可能是0個)，其後接著數個'1&amp;rsquo;作為開頭(也可能是0個)。&lt;br&gt;
(簡單說就是0後面接1就對了，也可以全0或全1)&lt;br&gt;
給定一個字串&lt;strong&gt;s&lt;/strong&gt; ，且可以將當中任意的'0&amp;rsquo;翻轉成'1&amp;rsquo;，&lt;br&gt;
也可以將任意的'1&amp;rsquo;翻轉成'0&amp;rsquo;，&lt;br&gt;
試求要將s經過翻轉操作成為&lt;strong&gt;單調遞增&lt;/strong&gt; 的狀態所需的&lt;strong&gt;最小翻轉次數&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;這題其實某種程度隱含了一點動態規劃的概念在內，&lt;br&gt;
但相對而言算是較簡單的。&lt;/p&gt;
&lt;p&gt;我們先思考根據單調遞增特性，由於這個特性，&lt;br&gt;
注定了&lt;strong&gt;一旦在某個點變為1，其後的每個單位也必須要是1&lt;/strong&gt; 才可以。&lt;br&gt;
若將最後的結果分成兩個狀況的話，事情會變比較簡單：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;全部都是0&lt;/li&gt;
&lt;li&gt;前面0後面1(含全部都是1)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;考慮做到第i位時，要保持單調遞增所需翻轉的次數:&lt;br&gt;
a. 如果第i位是0，對狀況1來說，不需額外作任何事情即可保持&lt;br&gt;
b. 如果第i位是1，對狀況1來說，要將第i位翻轉為0(翻轉次數+1)&lt;br&gt;
c. 如果第i位是0，對狀況2來說，要將第i位翻轉為1(翻轉次數+1)&lt;br&gt;
d.如果第i位是1，對狀況2來說，相當於從第i-1位時選擇狀況1/狀況2均可&lt;/p&gt;
&lt;p&gt;若我們將上面的狀況1所需的翻轉次數叫做f0，&lt;br&gt;
狀況2的所需次數叫做f1的話，&lt;br&gt;
上面的&lt;strong&gt;a/c就是第i位碰到'0&amp;rsquo;的狀況&lt;/strong&gt; ，此時從&lt;strong&gt;第i-1位的f0/f1&lt;/strong&gt; 更新到&lt;strong&gt;第i位&lt;/strong&gt; 時，&lt;br&gt;
&lt;strong&gt;新的f0不需改變&lt;/strong&gt; ，但&lt;strong&gt;f1必須遞增&lt;/strong&gt; ；&lt;br&gt;
&lt;strong&gt;b/d就是碰到'1&amp;rsquo;的狀況&lt;/strong&gt; ，更新時&lt;strong&gt;新的f1要取原先的f0, f1中較小的値&lt;/strong&gt; ，&lt;br&gt;
且&lt;strong&gt;f0必須要遞增&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;一開始什麼都還沒做，所以我們可以定&lt;strong&gt;f0, f1均為0&lt;/strong&gt; ，&lt;br&gt;
接下來從頭到尾依照碰到的字元進行操作。&lt;/p&gt;
&lt;p&gt;最終，答案只要取&lt;strong&gt;f0/f1中較小值&lt;/strong&gt; 即可。&lt;/p&gt;
&lt;p&gt;依此寫成程式碼：&lt;br&gt;
Java的部分可以利用for each的語法蜜糖來取出單個char，&lt;br&gt;
(記得S要先轉成char array)&lt;br&gt;
且需要留意&lt;strong&gt;f0的遞增要在取完f1之後&lt;/strong&gt; (不然值會錯)。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/95be0666e3bbfd9aa1755f3fdd02b8a4.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部分亦同，記得只有+=沒有++這種東西XD&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/fd557e6690a0eb852f4a78380769a26d.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(1)，需遍歷整個String的長度，但記錄用輔助變數只需常數單位)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 64 Array (12) / Two Pointer (3)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-64-array-12-two-pointer-3/</link><pubDate>Tue, 22 Oct 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-64-array-12-two-pointer-3/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 64 Array (12) / Two Pointer (3)" /&gt;&lt;p&gt;&lt;strong&gt;0080. Remove Duplicates from Sorted Array II (Medium)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given a sorted array &lt;em&gt;nums&lt;/em&gt;, remove the duplicates &lt;a class="link" href="https://en.wikipedia.org/wiki/In-place_algorithm" target="_blank" rel="noopener"
&gt;&lt;strong&gt;in-place&lt;/strong&gt; &lt;/a&gt; such that duplicates appeared at most &lt;em&gt;twice&lt;/em&gt; and return the new length.&lt;/p&gt;
&lt;p&gt;Do not allocate extra space for another array, you must do this by &lt;strong&gt;modifying the input array&lt;/strong&gt; &lt;a class="link" href="https://en.wikipedia.org/wiki/In-place_algorithm" target="_blank" rel="noopener"
&gt;** in-place**&lt;/a&gt; with O(1) extra memory.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Given nums = [1,1,1,2,2,3],
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Your function should return length = 5, with the first five elements of nums being 1, 1, 2, 2 and 3 respectively.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;It doesn&amp;#39;t matter what you leave beyond the returned length.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Given nums = [0,0,1,1,1,1,2,3,3],
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Your function should return length = 7, with the first seven elements of nums being modified to 0, 0, 1, 1, 2, 3 and 3 respectively.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;It doesn&amp;#39;t matter what values are set beyond the returned length.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Clarification:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Confused why the returned value is an integer but your answer is an array?&lt;/p&gt;
&lt;p&gt;Note that the input array is passed in by &lt;strong&gt;reference&lt;/strong&gt; , which means modification to the input array will be known to the caller as well.&lt;/p&gt;
&lt;p&gt;Internally you can think of this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// nums is passed in by reference. (i.e., without making a copy)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;int len = removeDuplicates(nums);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// any modification to nums in your function would be known by the caller.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// using the length returned by your function, it prints the first len elements.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;for (int i = 0; i &amp;lt; len; i++) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(nums[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個已排序的陣列nums，將其重復超過2次的部分捨棄掉，&lt;br&gt;
且使用in-place的方式來操作(在原陣列操作)，回傳最終結果的長度。&lt;/p&gt;
&lt;p&gt;這題算是之前的&lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-10-linked-list-2-8384845e8ad6" target="_blank" rel="noopener"
&gt;0083. Remove Duplicates from Sorted List (Easy)&lt;/a&gt;的延伸，說真的我認為這題不該當作Medium難度XD&lt;/p&gt;
&lt;p&gt;再次提醒，當題目要求使用in-place的時候，&lt;br&gt;
對一些語言的確是可以真的用&lt;strong&gt;刪掉單點&lt;/strong&gt; 的方式來處理(例如Python)，&lt;br&gt;
但刪除這件事情也是較耗時的操作，所以沒特別要求的話，&lt;br&gt;
請依照題目希望你的方向來撰寫(&lt;strong&gt;面試則依照面試官的限制條件&lt;/strong&gt; )。&lt;/p&gt;
&lt;p&gt;我們先來講筆者直觀想到的解法，再來提leetcode上另一位高手的解。&lt;/p&gt;
&lt;p&gt;直觀而言，要怎麼能夠知道有沒有碰到&lt;strong&gt;3個&lt;/strong&gt; 以上的重復呢？&lt;br&gt;
最直接的方式就是使用一個cnt變數來記錄。&lt;br&gt;
同時，為了要確認是否是重複的數，&lt;br&gt;
我們需要記錄上一次開始重復的數last。&lt;/p&gt;
&lt;p&gt;那麼步驟就會像這樣：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果&lt;strong&gt;nums長度 ≤ 2&lt;/strong&gt; 的話，表示完全不用更動，&lt;br&gt;
直接&lt;strong&gt;回傳nums的長度&lt;/strong&gt; 即可。&lt;/li&gt;
&lt;li&gt;將&lt;strong&gt;last設為nums[0], cnt設為1,&lt;/strong&gt; 預計要覆蓋的** index j設為1。**&lt;/li&gt;
&lt;li&gt;令i從1開始一個迴圈來遍歷整個nums:&lt;br&gt;
3-a. 如果&lt;strong&gt;nums[i]不等於last&lt;/strong&gt; 的話，表示&lt;strong&gt;數字不同&lt;/strong&gt; ，&lt;br&gt;
必須將其&lt;strong&gt;覆蓋到j的位置&lt;/strong&gt; 。&lt;br&gt;
同時，我們必須更新&lt;strong&gt;last為nums[i]，j要遞增，&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;cnt要重設為1&lt;/strong&gt; (用來做下一次比較)。&lt;br&gt;
3-b. 否則，如果&lt;strong&gt;兩者相等且cnt小於2&lt;/strong&gt; ，&lt;br&gt;
代表重複未超過2次，&lt;strong&gt;同樣要進行複寫和遞增j，但cnt要遞增&lt;/strong&gt; 。&lt;/li&gt;
&lt;li&gt;當整個迴圈完畢以後，&lt;strong&gt;j&lt;/strong&gt; 應該是位在&lt;strong&gt;處理過後的陣列的尾端+1&lt;/strong&gt; 的位置。&lt;br&gt;
所以&lt;strong&gt;回傳j即可代表新的陣列的總長&lt;/strong&gt; 。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;聽起來有點多，但其實寫起來並不困難，&lt;br&gt;
但還有更厲害的解法XD&lt;/p&gt;
&lt;p&gt;這邊提供了LeetCode上&lt;strong&gt;StefanPochmann&lt;/strong&gt; 的解，&lt;br&gt;
簡單來說呢，我們可以換個思路：&lt;br&gt;
由於&lt;strong&gt;整個陣列是排序過的&lt;/strong&gt; ，當我們遍歷陣列時，&lt;br&gt;
&lt;strong&gt;某個數字應不應該要覆蓋到index上&lt;/strong&gt; ，&lt;br&gt;
(筆者之前的解法將這個index叫做j，相當於這個解裡的i)&lt;br&gt;
取決於&lt;strong&gt;前面兩個數字是否跟它一樣&lt;/strong&gt; ；&lt;br&gt;
都一樣的話，就產生了&lt;strong&gt;三個相同的數&lt;/strong&gt; 的狀況，&lt;br&gt;
自然不需要再被取用，且由於排序的關係，&lt;br&gt;
我們&lt;strong&gt;只需要比較前面兩個數字中較前面的那個&lt;/strong&gt; 即可。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;當i小於2時，直接無條件覆蓋(&lt;/strong&gt; 因為不可能重複超過2次)；&lt;br&gt;
&lt;strong&gt;當遍歷到的値n大於num[i-2]&lt;/strong&gt; 時，代表&lt;strong&gt;數字不一樣&lt;/strong&gt; 或&lt;strong&gt;重複未超過2次&lt;/strong&gt; ，&lt;br&gt;
則應&lt;strong&gt;將其值覆蓋過去並遞增i&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;各自寫成程式碼如下：&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/fccdca5faf3d5e8e4aac30bb83d61733.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/9fa5e84db7919fbc222eaf5479cb23f1.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(1)，我們需要遍歷整個陣列，且儲存用的輔助變數只有常數個)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 52 Array (11)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-52-array-11/</link><pubDate>Fri, 20 Sep 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-52-array-11/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 52 Array (11)" /&gt;&lt;p&gt;&lt;strong&gt;0268. Missing Number (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(當然，Medium的拍手也可以多拍幾下啦XD)&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given an array containing &lt;em&gt;n&lt;/em&gt; distinct numbers taken from &lt;code&gt;0, 1, 2, ..., n&lt;/code&gt;, find the one that is missing from the array.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [3,0,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [9,6,4,2,3,5,7,0,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; :&lt;br&gt;
Your algorithm should run in linear runtime complexity. &lt;br&gt;
Could you implement it using only constant extra space complexity?&lt;/p&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個陣列內含n個不同的數字，&lt;br&gt;
(從0~n之間選n個，也就是說會少一個)&lt;br&gt;
試找出漏掉的那個數。&lt;/p&gt;
&lt;p&gt;首先最笨最暴力的方法當然是排序過後再從0開始看nums[i]是否為i。&lt;br&gt;
這個做法顯然經過排序就需要O(NlogN)的時間，&lt;br&gt;
但其實還是可以通過測資XD&lt;/p&gt;
&lt;p&gt;我們考慮比較簡單一點的作法：&lt;br&gt;
我們都知道梯形公式(以及那個聰明的高斯XD)，&lt;br&gt;
從0加到n的總和會是n * (n+1) / 2。&lt;/p&gt;
&lt;p&gt;所以想要知道中間漏掉哪個，就將0~n的總和，&lt;br&gt;
減去nums的所有元素全部加起來即可。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/f2d47f7e55b9e3b9cda2a112ef414d87.js"&gt;&lt;/script&gt;
&lt;p&gt;在Python中不要忘記了除法取整數要用「//」，&lt;br&gt;
並且陣列的和可以用sum來取得。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/c956cdd9bc2f5d83735716cdaacb7dea.js"&gt;&lt;/script&gt;
&lt;p&gt;這種解法要留意一點，如果在有限制int的狀態下，&lt;br&gt;
n*(n+1)是有機會溢位的！所以如果有時間的話，&lt;br&gt;
還是可以嘗試一下下面提到的解法。&lt;/p&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(1)，乘法只做一次，加法會做n次，儲存的部分只有幾個輔助的變數)&lt;/p&gt;
&lt;p&gt;「這題有別的解法嗎？」&lt;br&gt;
(其實用Bitwise Operation來解也很簡單，&lt;br&gt;
這邊留給讀者可以自行嘗試看看(用XOR)。)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 47 Array (10)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-47-array-10/</link><pubDate>Mon, 09 Sep 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-47-array-10/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 47 Array (10)" /&gt;&lt;p&gt;&lt;strong&gt;0204. Count Primes (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(當然，Medium的拍手也可以多拍幾下啦XD)&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Count the number of prime numbers less than a non-negative number, *&lt;strong&gt;n&lt;/strong&gt; *.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: 10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個非負整數n，試求所有小於這個n的質數。&lt;/p&gt;
&lt;p&gt;讓我們來複習一下國中(還是國小？)數學：&lt;br&gt;
質數的定義就是除了&lt;strong&gt;1和自己&lt;/strong&gt; 以外，沒有其他數可以整除它的正整數。&lt;/p&gt;
&lt;p&gt;透過這個特點我們可以再延伸：&lt;br&gt;
因為合成數必然可以拆成&lt;strong&gt;質數相乘&lt;/strong&gt; ，&lt;br&gt;
所以我們要判定某個數是否是質數的話，&lt;br&gt;
只要將&lt;strong&gt;其他比它小的質數&lt;/strong&gt; 測試它&lt;strong&gt;是否是目標的因數&lt;/strong&gt; 即可。&lt;/p&gt;
&lt;p&gt;另外，由於一個數若能拆成2數相乘，&lt;br&gt;
那麼&lt;strong&gt;其中一個因數會小於等於這個數的開根號&lt;/strong&gt; ；&lt;br&gt;
&lt;strong&gt;另一個因數則是大於等於這個數的開根號&lt;/strong&gt; 。&lt;br&gt;
如此一來，我們只要檢驗2**~目標數的開根號** 的數是否能&lt;strong&gt;整除目標數&lt;/strong&gt; 即可。&lt;/p&gt;
&lt;p&gt;所以老師會教你一個消去法：&lt;br&gt;
首先將2的倍數排除掉，再將3的倍數排除掉，&lt;br&gt;
再將5的倍數排除掉……(2倍以上，不含自己)&lt;br&gt;
一個個操作，&lt;strong&gt;走到沒有被排除掉的數即為質數&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;我們可以再進一步處理一點：&lt;br&gt;
假設現在處理到i，&lt;br&gt;
那麼其實我們應該知道&lt;strong&gt;i*2, i*3, …, i*(i-1&lt;/strong&gt; )的部分，&lt;br&gt;
應該都被前面的操作&lt;strong&gt;排除&lt;/strong&gt; 了，&lt;br&gt;
故每次我們只要從&lt;strong&gt;i*i開始，排除到n，&lt;br&gt;
也就是i走到最大n的開根號&lt;/strong&gt;即可。&lt;/p&gt;
&lt;p&gt;故整個程式會從2到根號n，每次將對應i的i倍以上的部分設為非質數，&lt;br&gt;
最後計算總質數有多少個。&lt;/p&gt;
&lt;p&gt;Java的部分，由於boolean預設為false，&lt;br&gt;
這邊使用nPrime代表not prime，所以nPrime為false代表這個數是質數，&lt;br&gt;
要設定成不是質數時請用nPrime[j] = true。&lt;br&gt;
在處理完後請記得bound後面的質數個數要記得加起來。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/249749ca7fc24c38e1573803cba598c1.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部分，sqrt可以直接用n ** 0.5，&lt;br&gt;
並且我們可以用1代表質數，0代表非質數，&lt;br&gt;
讀者可以仔細看一下第8行，其實和Java迴圈的目的是一樣的，&lt;br&gt;
不過這邊直接最後才算prime陣列的總和來取得質數個數。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/998546f5800bc10c64ad1e0cc240c4a3.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(n), O(&lt;em&gt;n&lt;/em&gt; log log &lt;em&gt;n&lt;/em&gt;))&lt;br&gt;
(外層迴圈的boundary上限是sqrt(n)，&lt;br&gt;
內層j的次數上限會從n/2 -&amp;gt; sqrt(n)，具體計算我也不會XD&lt;br&gt;
以Wikipedia提供的時間複雜度為O(&lt;em&gt;n&lt;/em&gt; log log &lt;em&gt;n&lt;/em&gt;)。&lt;br&gt;
&lt;a class="link" href="https://zh.wikipedia.org/wiki/%E5%9F%83%E6%8B%89%E6%89%98%E6%96%AF%E7%89%B9%E5%B0%BC%E7%AD%9B%E6%B3%95" target="_blank" rel="noopener"
&gt;https://zh.wikipedia.org/wiki/%E5%9F%83%E6%8B%89%E6%89%98%E6%96%AF%E7%89%B9%E5%B0%BC%E7%AD%9B%E6%B3%95&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
Python Taiwan, 林宣丞：&lt;strong&gt;此篩選方式又稱&lt;/strong&gt; 埃拉托斯特尼篩法&lt;/strong&gt;(sieve of Eratosthenes)。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;如果你／妳非常喜歡這篇文章，可以按著拍手直到50下。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;也請記得「Follow」我，隨時收看最新的文章。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>從LeetCode學演算法 - 40 Array (9)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-40-array-9/</link><pubDate>Mon, 26 Aug 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-40-array-9/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 40 Array (9)" /&gt;&lt;p&gt;&lt;strong&gt;0238. Product of Array Except Self (Medium)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given an array &lt;code&gt;nums&lt;/code&gt; of &lt;em&gt;n&lt;/em&gt; integers where &lt;em&gt;n&lt;/em&gt; &amp;gt; 1, return an array &lt;code&gt;output&lt;/code&gt;such that &lt;code&gt;output[i]&lt;/code&gt; is equal to the product of all the elements of &lt;code&gt;nums&lt;/code&gt;except &lt;code&gt;nums[i]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [1,2,3,4]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [24,12,8,6]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Please solve it ** without division** and in O(&lt;em&gt;n&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Follow up:&lt;/strong&gt;&lt;br&gt;
Could you solve it with constant space complexity? (The output array &lt;strong&gt;does not&lt;/strong&gt; count as extra space for the purpose of space complexity analysis.)&lt;/p&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;題目給定一個陣列nums，目標是產生一個output陣列，&lt;br&gt;
這個output上的output[i]都相當於除了nums[i]以外其他的乘積。&lt;br&gt;
要求不能用除法且必須在O(n)的時間完成。&lt;br&gt;
延伸要求：用來做為輸出的output不算在額外的空間內的話，&lt;br&gt;
是否可使用常數空間複雜度來解決此題？(即僅使用O(1)空間)&lt;/p&gt;
&lt;p&gt;這題如果用暴力法來解的話，&lt;br&gt;
就是使用兩層for-loop，將每個output[i]先初始化為1，&lt;br&gt;
再進行對其他值的相乘(也就是要乘N-1次)，&lt;br&gt;
所需的總乘法會是N*(N-1)，故時間複雜度為O(N²)。&lt;/p&gt;
&lt;p&gt;這樣顯然速度不太好，我們再來考慮一下實際的情形。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nums 2 3 4 5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;res 3*4*5 2*4*5 2*3*5 2*3*4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;l 2 2*3 2*3*4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r 3*4*5 4*5 5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;假設有一個陣列是[2, 3, 4, 5]，而我們要求的結果是res，&lt;br&gt;
按照定義我們可以先將res的結果寫出。&lt;br&gt;
仔細觀察我們可以發現，如果將res的每項&lt;strong&gt;拆成兩組相乘&lt;/strong&gt; ，&lt;br&gt;
我們可以拆分成l, r兩個陣列，&lt;br&gt;
當中&lt;strong&gt;l從index 1&lt;/strong&gt; 開始&lt;strong&gt;往後推&lt;/strong&gt; 有數值，依序是&lt;strong&gt;2, 2*3, 2*3*4&lt;/strong&gt; 。&lt;br&gt;
&lt;strong&gt;r則從index 2&lt;/strong&gt; 開始&lt;strong&gt;往回推&lt;/strong&gt; 有數值，依序是&lt;strong&gt;5, 4*5, 3*4*5&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;(這邊的拆分就是取明顯有&lt;strong&gt;斷層&lt;/strong&gt; 的部分，&lt;strong&gt;空出來的部分為1&lt;/strong&gt; )&lt;/p&gt;
&lt;p&gt;所以我們可以先將res初始化，用它&lt;strong&gt;承載l&lt;/strong&gt; 的部分，&lt;br&gt;
再依次將r從1開始，把5,4,3依序乘上去一個值以後依序乘到res中，&lt;br&gt;
這樣一來計算res的時候就只有分別經歷過兩次O(N)，&lt;br&gt;
&lt;strong&gt;時間複雜度會維持在O(N)。&lt;br&gt;
同時，因為前面第一次利用了res來儲存l的部分，&lt;br&gt;
第二次只用單個變數r來依序記錄要乘的順序，&lt;br&gt;
故扣除res以後空間複雜度為O(1)。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/77360ac2bf466202bd25645e0ab38a63.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/4d8b366564facd0e05a0fcc2892a07e3.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(1))&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 39 Array (8) / Hash Table (1)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-39-array-8-hash-table-1/</link><pubDate>Sun, 25 Aug 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-39-array-8-hash-table-1/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 39 Array (8) / Hash Table (1)" /&gt;&lt;p&gt;&lt;strong&gt;1160. Find Words That Can Be Formed by Characters (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;You are given an array of strings &lt;code&gt;words&lt;/code&gt; and a string &lt;code&gt;chars&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A string is &lt;em&gt;good&lt;/em&gt; if it can be formed by characters from &lt;code&gt;chars&lt;/code&gt; (each character can only be used once).&lt;/p&gt;
&lt;p&gt;Return the sum of lengths of all good strings in &lt;code&gt;words&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: words = [&amp;#34;cat&amp;#34;,&amp;#34;bt&amp;#34;,&amp;#34;hat&amp;#34;,&amp;#34;tree&amp;#34;], chars = &amp;#34;atach&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The strings that can be formed are &amp;#34;cat&amp;#34; and &amp;#34;hat&amp;#34; so the answer is 3 + 3 = 6.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: words = [&amp;#34;hello&amp;#34;,&amp;#34;world&amp;#34;,&amp;#34;leetcode&amp;#34;], chars = &amp;#34;welldonehoneyr&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The strings that can be formed are &amp;#34;hello&amp;#34; and &amp;#34;world&amp;#34; so the answer is 5 + 5 = 10.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= words.length &amp;lt;= 1000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= words[i].length, chars.length &amp;lt;= 100&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;All strings contain lowercase English letters only.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定字串陣列words和一個字串chars，&lt;br&gt;
如果陣列中的一個字串能被定義為good，&lt;br&gt;
代表它是能由chars的中的字元組成(&lt;strong&gt;每個字元最多只能使用一次&lt;/strong&gt; )，&lt;br&gt;
試將所有good的字串長度加總回傳。&lt;/p&gt;
&lt;p&gt;一般用來描述某個項目儲存多少值都會使用HashTable/HashMap，&lt;br&gt;
對應到Python則通常可使用dictionary。&lt;br&gt;
HashTable相關的儲存方式有搜尋為&lt;strong&gt;O(1)&lt;/strong&gt; 的特性，&lt;br&gt;
和一般常見的搜尋資料結構如Binary Search Tree需要&lt;strong&gt;O(log N)&lt;/strong&gt; 不同，&lt;br&gt;
原因是因為會實作hash function，令不同的值儲存的時候能夠得到不同的hash值，從而直接找到對應的位置。&lt;br&gt;
(但當&lt;strong&gt;hash function的選擇不好&lt;/strong&gt; ，或儲存的東西太多時，&lt;br&gt;
有機會發生碰撞(&lt;strong&gt;collision)&lt;/strong&gt; 問題，導致查找時間加長，這裡暫不討論。)&lt;/p&gt;
&lt;p&gt;在題目的條件限定在英文字母相關的時候或有特定長度限制時，&lt;br&gt;
我們常可以用很簡單的方式來進行hash table/hash map的操作，&lt;br&gt;
例如英文字母a~z只有26個，&lt;br&gt;
如果題目和計算字母出現的次數有關聯性的話，&lt;br&gt;
我們可以直接&lt;strong&gt;以一個長度為26的陣列/串列來記錄&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;以這題來說，題目所要求的檢查方式，&lt;br&gt;
就是先確認chars裡面有&lt;strong&gt;幾個a, 幾個b, &amp;hellip;&amp;hellip; , 幾個z&lt;/strong&gt; ，&lt;br&gt;
接下來對&lt;strong&gt;每個字串&lt;/strong&gt; 確認其組成，&lt;br&gt;
&lt;strong&gt;一旦組成需要的個數大於chars所擁有的，我們就可以直接跳過它&lt;/strong&gt; ；&lt;br&gt;
反之若每個字母所需的個數都滿足，&lt;br&gt;
則將要回傳的結果加上這個字串的長度，&lt;br&gt;
一直到全數檢查完畢即可回傳結果。&lt;/p&gt;
&lt;p&gt;下面Java的程式碼部分演示了上面所提到的步驟。&lt;br&gt;
裡面用到語法蜜糖(Syntactic sugar)的作法，讀者應稍加掌握，&lt;br&gt;
如for迴圈Java有提供連續從array中依序取出單個變數的寫法，&lt;br&gt;
類似於Python中**”for word in words”** 的方式。&lt;br&gt;
我們將check的部分獨立出來，作為檢查並回傳長度的部分，&lt;br&gt;
一旦沒有成立，直接回傳0，若最終檢查通過則將len(word)回傳。&lt;/p&gt;
&lt;p&gt;之前應該也提到過char可以&lt;strong&gt;使用ASCII的代表數字來加減&lt;/strong&gt; ，&lt;br&gt;
所以這邊取a到z來做為index 0到26，起始的基準點是&amp;rsquo;a&amp;rsquo;。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/6e9778a0d0f8e745c8fa0e29f3b4c74e.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部分，使用&lt;strong&gt;Counter&lt;/strong&gt; 可以很簡便的計算一個字串中的字母組成，&lt;br&gt;
我們可以直接檢查每個key的值的大小來確認是否足夠組成，&lt;br&gt;
但需留意Counter並&lt;strong&gt;不會&lt;/strong&gt; 放置沒有出現的字母的key，&lt;br&gt;
故每次要先檢查是否dic中本來就沒有現在要檢查的key值，&lt;br&gt;
避免發生錯誤。&lt;/p&gt;
&lt;p&gt;更簡便的方式是直接使用&lt;strong&gt;count&lt;/strong&gt; 來計算某個字母在字串裡面出現的次數。&lt;br&gt;
這個應該是目前Python答案中跑最快的方法，&lt;br&gt;
但可能是因為測試資料中比較常出現False的狀況，&lt;br&gt;
&lt;strong&gt;導致word不用每個字母都算完就結束了&lt;/strong&gt; 。&lt;br&gt;
不然在最糟的狀況下，word的每個字母應該都會算一次count，&lt;br&gt;
且相同的字母在不同的位置上還會重新再算過一次；&lt;br&gt;
雖然時間複雜度還是一樣(字串最長限定是100)，&lt;br&gt;
&lt;strong&gt;若整份資料比較容易是good的字居多的話，&lt;br&gt;
並不建議用這樣子的方式操作。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/da4447b5745070e12cdfc3b2e380d06b.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(Java: O(N)/O(1)，&lt;br&gt;
準確來說，最大要走完所有字的長度(所以應該可以說N個字*長度L)，&lt;br&gt;
空間的部分，使用了26個字母來做為查表用的分類，&lt;br&gt;
所以同一時間用到的只會有2組長度26的陣列及幾個暫存用變數&lt;br&gt;
Python: 對二個解也都是 O(N)/O(1)，&lt;br&gt;
但第二個解在最差的狀況下會每個字母都重覆掃過。)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 38 Array (7)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-38-array-7/</link><pubDate>Fri, 23 Aug 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-38-array-7/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 38 Array (7)" /&gt;&lt;p&gt;&lt;strong&gt;0088. Merge Sorted Array (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given two sorted integer arrays &lt;em&gt;nums1&lt;/em&gt; and &lt;em&gt;nums2&lt;/em&gt;, merge &lt;em&gt;nums2&lt;/em&gt; into &lt;em&gt;nums1&lt;/em&gt; as one sorted array.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The number of elements initialized in &lt;em&gt;nums1&lt;/em&gt; and &lt;em&gt;nums2&lt;/em&gt; are &lt;em&gt;m&lt;/em&gt; and &lt;em&gt;n&lt;/em&gt; respectively.&lt;/li&gt;
&lt;li&gt;You may assume that &lt;em&gt;nums1&lt;/em&gt; has enough space (size that is greater or equal to &lt;em&gt;m&lt;/em&gt; + &lt;em&gt;n&lt;/em&gt;) to hold additional elements from &lt;em&gt;nums2&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nums1 = [1,2,3,0,0,0], m = 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nums2 = [2,5,6], n = 3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [1,2,2,3,5,6]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;這題雖然相對比較無聊，&lt;br&gt;
但merge的過程中其實蠻像merge sort的merge的，&lt;br&gt;
所以選來讓讀者熟悉一下merge的概念，對上上篇提的應該會有幫助。&lt;/p&gt;
&lt;p&gt;題目給定兩個陣列及有放元素的對應長度，兩者除了未放元素的0以外，&lt;br&gt;
其他均已排序。同時，題目也假設第一個陣列必定有足夠空間，&lt;br&gt;
可以放入全部的元素。請嘗試將兩個陣列merge成一個排序的陣列，&lt;br&gt;
&lt;strong&gt;放置在第一個陣列中&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;由於最終要放在nums1裡，我們可以先考慮會有的情形：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;n等於0：不用搬了，因為只有nums1有非0值。&lt;/li&gt;
&lt;li&gt;m等於0：只要把nums2的全搬過來即可&lt;/li&gt;
&lt;li&gt;其他：按照merge的原則，將雙方依序填入nums1中。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;到這邊讀者可能會想到常規的merge是開一個&lt;strong&gt;新陣列&lt;/strong&gt; 將雙方依次比較，&lt;br&gt;
每次將較小的值放入新陣列，最後排序完成。&lt;br&gt;
現在說想放到nums1當然是可以，但&lt;strong&gt;nums1前面有值&lt;/strong&gt; ，&lt;br&gt;
直接這麼做會蓋掉耶！那怎麼辦呢？&lt;br&gt;
答案很簡單，我們已經知道兩邊的長度是m跟n，&lt;br&gt;
那麼合併後的長度就會是&lt;strong&gt;m+n&lt;/strong&gt; ，尾端的index會是&lt;strong&gt;m+n-1&lt;/strong&gt; 。&lt;br&gt;
我們只要將**「每次將較小的值放入開頭」** 改成**「每次將較大的值放入結尾」** ，最後即可達到相同的狀況。&lt;/p&gt;
&lt;p&gt;所以操作順序會是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;令i, j, k分別為&lt;strong&gt;m-1, n-1, m+n-1&lt;/strong&gt; 2. 當&lt;strong&gt;i和j都≥0&lt;/strong&gt; 時：&lt;br&gt;
 如果nums1的值比nums2的值大，&lt;br&gt;
 將nums1的尾端放到k的位置，同時遞減i跟k以更新。&lt;br&gt;
 如果nums1的值比nums2的值小(或相等)，&lt;br&gt;
 將nums2的尾端放到k的位置，同時遞減j跟k以更新。&lt;br&gt;
 &lt;strong&gt;重複這個迴圈直到跳出，代表有一邊陣列放完了&lt;/strong&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;當 &lt;strong&gt;i ≥ 0&lt;/strong&gt; 時，表示其實我們已經做完了，所以不用任何操作。&lt;br&gt;
(剩下nums1前面的部分，不需要再動了)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;當 &lt;strong&gt;j ≥ 0&lt;/strong&gt; 時，表示 i 的部分已經被用完了，&lt;br&gt;
剩下的就是一路將 j 的對應值填入即可。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Java的部分，可以利用**”&amp;ndash;“** 讓對應index先填入以後再進行遞減，&lt;br&gt;
步驟流程請參考上面演算方式並對照。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/0bc0b39163cf830be89a382caf158c86.js"&gt;&lt;/script&gt;
&lt;p&gt;Python沒有++或 &amp;ndash; 這種東西，所以遞減時要乖乖的自己等於自己減一，&lt;br&gt;
不過可以將需要遞減的寫在同一行，會稍微簡潔一點點。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/1fd9346c4e3203a7c61cb1be1db32380.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(m+n)，O(1)&lt;br&gt;
前者是典型merge的時間，後者是因為我們只有使用常數變數，&lt;br&gt;
其他都是原有的記憶體空間，故僅額外占用到O(1)的空間)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;1.&lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-4-6a631eb50da3?source=friends_link&amp;amp;sk=b93e9c626c915557269d99a6ad03862d" target="_blank" rel="noopener"
&gt;&lt;strong&gt;0021. Merge Two Sorted Lists (Easy)&lt;/strong&gt; &lt;/a&gt;2. &lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-36-merge-sort-1-21dde785b0df?source=friends_link&amp;amp;sk=df2e91f82ce0fe4fb91c6866e87549dc" target="_blank" rel="noopener"
&gt;&lt;strong&gt;0148. Sort List (Medium)&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 34 Array (6)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-34-array-6/</link><pubDate>Mon, 19 Aug 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-34-array-6/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 34 Array (6)" /&gt;&lt;p&gt;&lt;strong&gt;0977. Squares of a Sorted Array (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given an array of integers &lt;code&gt;A&lt;/code&gt; sorted in non-decreasing order, return an array of the squares of each number, also in sorted non-decreasing order.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [-4,-1,0,3,10]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [0,1,9,16,100]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [-7,-3,2,3,11]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [4,9,9,49,121]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= A.length &amp;lt;= 10000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-10000 &amp;lt;= A[i] &amp;lt;= 10000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;A&lt;/code&gt; is sorted in non-decreasing order.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個非遞減排序(也就是相等或遞增)的陣列，&lt;br&gt;
以排序好的狀況回傳其每個元素平方後所得的陣列。&lt;/p&gt;
&lt;p&gt;一般我們所熟知的排序應該需要至少O(NlogN)的狀況才能達成，&lt;br&gt;
(之後筆者會再挑一題來專門作排序這個部分的問題)&lt;br&gt;
但這題在平方過以後，並不算完全散亂的狀態，&lt;br&gt;
原先&lt;strong&gt;負整數的部分平方後會由大到小排列&lt;/strong&gt; ；&lt;br&gt;
原先&lt;strong&gt;0到正整數的部分平方後則會由小到大排列&lt;/strong&gt; 。&lt;br&gt;
利用這點我們可以使用two pointer的模式來進行處理，&lt;br&gt;
每次將兩邊的元素絕對值進行比較，比較大的代表其平方後比較大，&lt;br&gt;
將其取出置於新的陣列/串列的最右邊，依序往回填。&lt;/p&gt;
&lt;p&gt;實作上，如果不限制A必須保持原樣的話，&lt;br&gt;
也可以先將負號的部分全數去掉，再進行後面的比較時，&lt;br&gt;
就可免去取絕對值了。&lt;/p&gt;
&lt;p&gt;Java的部分兩個方法皆有提供，讀者可依實際狀況決定寫法。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/37366814ed0061020dd40565400afd5c.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部分，還另外提供了一個偷吃步的方法：&lt;br&gt;
使用sorted函式搭配list comprehension，一行即可解決問題，&lt;br&gt;
但其時間複雜度為O(NlogN) (因為直接使用排序法)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;神奇的是，這個方法還比較快XD&lt;/em&gt;&lt;br&gt;
(估計是A的長度限制在比較小的範圍，可能測試資料也不是很大，&lt;br&gt;
所以主動用排序帶來的負面效益較低的原因)&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/1a81a05cc447417389bb832aab159685.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N), O(N)&lt;br&gt;
每個陣列均會掃過一次，且會產生一個新的陣列。)&lt;/p&gt;
&lt;p&gt;「這題在產生新的陣列的時候跟合併排序(Merge Sort)其實很像，&lt;br&gt;
可以概略描述Merge Sort的作法嗎？」&lt;br&gt;
(可以XD 這個我們之後會專門寫一題講解)&lt;br&gt;
(如果不想等的話，可以先查詢Merge Sort，應該有蠻多資料的，&lt;br&gt;
但簡言之，就是每次將陣列拆兩半，&lt;br&gt;
分別各自排序過後(mergesort)，再依序合併起來(merge)。)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;相似及延伸：&lt;br&gt;
1.&lt;/strong&gt; &lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-4-6a631eb50da3?source=your_stories_page---------------------------" target="_blank" rel="noopener"
&gt;0021. Merge Two Sorted Lists (Easy)&lt;/a&gt;&lt;br&gt;
2. &lt;a class="link" href="https://leetcode.com/problems/sort-list/" target="_blank" rel="noopener"
&gt;0148. Sort List (Medium)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 33 Array (5)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-33-array-5/</link><pubDate>Sun, 18 Aug 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-33-array-5/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 33 Array (5)" /&gt;&lt;p&gt;&lt;strong&gt;0905. Sort Array By Parity (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given an array &lt;code&gt;A&lt;/code&gt; of non-negative integers, return an array consisting of all the even elements of &lt;code&gt;A&lt;/code&gt;, followed by all the odd elements of &lt;code&gt;A&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You may return any answer array that satisfies this condition.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [3,1,2,4]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [2,4,3,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The outputs [4,2,3,1], [2,4,1,3], and [4,2,1,3] would also be accepted.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= A.length &amp;lt;= 5000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0 &amp;lt;= A[i] &amp;lt;= 5000&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個不含負整數的整數陣列A，回傳一個陣列，&lt;br&gt;
這個陣列的前面會是所有A的偶數的元素，&lt;br&gt;
跟在後面的是所有A的奇數的元素的部分。&lt;/p&gt;
&lt;p&gt;這題我們在先前的&lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-25-array-3-bca3bca74ca2?source=friends_link&amp;amp;sk=2b26f2e316bbfd7bc96ff372259e652a" target="_blank" rel="noopener"
&gt;Move Zeros&lt;/a&gt;題目中有提到過類似的部分，&lt;br&gt;
如果當時我們只想把0往後挪而不需考慮保留原順序，&lt;br&gt;
可以從兩端開始掃描，&lt;strong&gt;找到左邊是0而右邊非0並交換&lt;/strong&gt; 就可以解完此題；&lt;br&gt;
這題概念是一樣的，只是變成要&lt;strong&gt;左邊全是偶數，右邊全是奇數&lt;/strong&gt; 。&lt;br&gt;
演算的順序大概會像這樣：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;分別取兩端的index作為起始(i = 0, j = l-1, l為A的長度)&lt;/li&gt;
&lt;li&gt;先確認i的位置是否為奇數，若否，則遞增i，直到A[i]為奇數&lt;/li&gt;
&lt;li&gt;再確認j的位置是否為偶數，若否，則遞減j，直到A[j]為偶數&lt;/li&gt;
&lt;li&gt;交換A[i], A[j]&lt;/li&gt;
&lt;li&gt;重複前述2~4的操作直到i不再小於j(開始前也要檢查)&lt;/li&gt;
&lt;li&gt;此時全數交換完畢，所有偶數應排在奇數之前&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這邊程式碼需要注意continue的作用，&lt;br&gt;
目的是讓每次index變動都進行i&amp;lt;j的檢查，&lt;br&gt;
唯有這個條件成立，我們才有可能需要進行交換。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/8f6aee4e11e4bd4a225c1efbe622f17f.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部分後面提供了一個非in-place的作法，&lt;br&gt;
也就是各自將偶數和奇數的串列累積起來，&lt;br&gt;
最後再將其連接。好處是比較簡單，缺點是要額外的空間來存，&lt;br&gt;
端看使用者需求和題目需求來決定。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/7de1ffdc528c5ff7ce72ad3e0b4fea78.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N), O(1)&lt;br&gt;
two pointer會掃過整個陣列，所以時間複雜度為O(N)；&lt;br&gt;
如果不另外開陣列/串列的話，可以用in-place達到則空間複雜度為O(1)，&lt;br&gt;
如果像Python額外提到的方法的話則由於額外儲存的關係需要O(N))&lt;/p&gt;
&lt;p&gt;「如果除了偶數在前，奇數在後以外，要按照原先順序排列呢？」&lt;br&gt;
(Python的另一個解就會按順序排)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;相似及延伸：&lt;br&gt;
1.&lt;/strong&gt; &lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-25-array-3-bca3bca74ca2?source=friends_link&amp;amp;sk=2b26f2e316bbfd7bc96ff372259e652a" target="_blank" rel="noopener"
&gt;** 0283**. Move Zeros&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 27 Array (4)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-27-array-4/</link><pubDate>Fri, 09 Aug 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-27-array-4/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 27 Array (4)" /&gt;&lt;p&gt;&lt;strong&gt;0189. Rotate Array (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given an array, rotate the array to the right by &lt;em&gt;k&lt;/em&gt; steps, where &lt;em&gt;k&lt;/em&gt; is non-negative.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [1,2,3,4,5,6,7] and k = 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [5,6,7,1,2,3,4]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rotate 1 steps to the right: [7,1,2,3,4,5,6]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rotate 2 steps to the right: [6,7,1,2,3,4,5]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rotate 3 steps to the right: [5,6,7,1,2,3,4]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [-1,-100,3,99] and k = 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [3,99,-1,-100]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rotate 1 steps to the right: [99,-1,-100,3]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rotate 2 steps to the right: [3,99,-1,-100]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Try to come up with as many solutions as you can, there are at least 3 different ways to solve this problem.&lt;/li&gt;
&lt;li&gt;Could you do it in-place with O(1) extra space?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;題目給定一個陣列，將其往右輪轉k步，&lt;br&gt;
要求直接將該陣列調整成輪轉後的結果。&lt;/p&gt;
&lt;p&gt;這題一旦沒有Note的要求的話瞬間&lt;strong&gt;簡單一百倍&lt;/strong&gt; 。&lt;br&gt;
舉例來說，我們可以直接將後k項和前l-k項合併起來(l為陣列長度)，&lt;br&gt;
就會是答案了；或者，將整個陣列重複銜接一次，取[(l-k):(2*l-k)]亦可。&lt;br&gt;
(這兩個解法筆者列在Python的註解中供讀者參閱)&lt;br&gt;
但，它們都不是in-place。&lt;/p&gt;
&lt;p&gt;要考慮到in-place的話，我們必須知道，&lt;br&gt;
一定有方法能讓他們跑到該有的地方，且不需用到超過O(1)以外的空間，&lt;br&gt;
一般就意味著會在陣列進行swap的操作(交換兩個元素)。&lt;/p&gt;
&lt;p&gt;先看一下原本的例子：&lt;br&gt;
&lt;code&gt;[1,2,3,4,5,6,7]&lt;/code&gt; and &lt;em&gt;k&lt;/em&gt; = 3 -&amp;gt; &lt;code&gt;[5,6,7,1,2,3,4]&lt;/code&gt;&lt;br&gt;
先不論其他的部分，我們可以發現5&lt;del&gt;7從最尾端3個變成最前面的3個了；&lt;br&gt;
與此同時，1&lt;/del&gt;4自然從最前面4個變成最尾端4個。&lt;br&gt;
我們先不論大家的順序，先將整個陣列倒過來的話，&lt;br&gt;
可以先達到1&lt;del&gt;4，5&lt;/del&gt;7分別占據目標的區塊的效果：[&lt;strong&gt;7,6,5&lt;/strong&gt; ,4,3,2,1]。&lt;br&gt;
接著再比對一下，發現&lt;strong&gt;區塊是對了，但各自剛好被顛倒過一次&lt;/strong&gt; ，&lt;br&gt;
那麼我們&lt;strong&gt;再對7&lt;del&gt;5及4&lt;/del&gt;1分別各進行一次反轉&lt;/strong&gt; ，就會得到我們要的結果。&lt;/p&gt;
&lt;p&gt;所以整個流程就會變成：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;將&lt;strong&gt;整個陣列&lt;/strong&gt; 進行反轉&lt;/li&gt;
&lt;li&gt;將&lt;strong&gt;前k個數&lt;/strong&gt; 進行反轉&lt;/li&gt;
&lt;li&gt;將&lt;strong&gt;後l-k個數&lt;/strong&gt; 進行反轉&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;反轉是很基本的操作，希望讀者能熟練掌握，&lt;br&gt;
原則上利用two pointer的方式，&lt;strong&gt;每次將兩個元素進行交換&lt;/strong&gt; ，&lt;br&gt;
並對pointer位置進行遞增/遞減的操作，&lt;strong&gt;直到相交&lt;/strong&gt; 為止。&lt;br&gt;
(例: [&lt;strong&gt;1&lt;/strong&gt; ,2,3,&lt;strong&gt;4&lt;/strong&gt; ]-&amp;gt;[4,&lt;strong&gt;2&lt;/strong&gt; ,&lt;strong&gt;3&lt;/strong&gt; ,1]-&amp;gt;[4,&lt;em&gt;3&lt;/em&gt;,&lt;em&gt;2&lt;/em&gt;,1])&lt;br&gt;
Java的部分的兩數交換需要宣告一個暫存值tmp(temp)，&lt;br&gt;
Python的部分則可直接使用a, b = b, a的方式進行交換。&lt;br&gt;
最後，操作之前不要忘記將k先取除以l的餘數。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/0ed5ed74bd3ebc7331d2d781d201c853.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/b88c9b313855bb792cd4638c573d1036.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N), O(1)(如果是使用3次reverse的方法))&lt;/p&gt;
&lt;p&gt;「如不限制空間複雜度必須O(1)？」&lt;br&gt;
(可以參照上面Python程式碼中註解的做法)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;0031. Next Permutation&lt;/strong&gt; (可以用到swap跟reverse的操作來解題)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 25 Array (3)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-25-array-3/</link><pubDate>Tue, 06 Aug 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-25-array-3/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 25 Array (3)" /&gt;&lt;p&gt;&lt;strong&gt;0283. Move Zeroes (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given an array &lt;code&gt;nums&lt;/code&gt;, write a function to move all &lt;code&gt;0&lt;/code&gt;&amp;rsquo;s to the end of it while maintaining the relative order of the non-zero elements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [0,1,0,3,12]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [1,3,12,0,0]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You must do this &lt;strong&gt;in-place&lt;/strong&gt; without making a copy of the array.&lt;/li&gt;
&lt;li&gt;Minimize the total number of operations.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;題目給定一個陣列nums並要求將所有當中的0全部都放到最後面，&lt;br&gt;
且必須保持所有非0的元素的原有相對排列。&lt;br&gt;
另外Note中還要求必須要in-place且最小化總共操作的次數。&lt;/p&gt;
&lt;p&gt;這題其實有很多變形，雖然簡單，&lt;br&gt;
務必請留意題目所要求的條件，不要倉促作答。&lt;/p&gt;
&lt;p&gt;首先題目強調必須in-place(in-place的部分&lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-5-in-place-22d309007d15?source=friends_link&amp;amp;sk=f212fac9996b0a8b461ecad247deb90b" target="_blank" rel="noopener"
&gt;先前的文章&lt;/a&gt;有提到過)，&lt;br&gt;
故諸如開一個ArrayList/List來將所有非0的部分一個一個存起來的方法，&lt;br&gt;
在這裡就完全行不通了。&lt;/p&gt;
&lt;p&gt;直覺上或許讀者會想到諸如以下的方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;從頭開始找到第一個0元素(位置假設為a)&lt;/li&gt;
&lt;li&gt;找到從這個0元素以後第一個非0的元素&lt;/li&gt;
&lt;li&gt;將兩者交換&lt;/li&gt;
&lt;li&gt;從a+1開始找到下一個0元素&lt;/li&gt;
&lt;li&gt;再找到從這個0元素以後第一個非0的元素&lt;/li&gt;
&lt;li&gt;按照這樣的邏輯直到沒有更多的0元素，或找到0元素以後，&lt;br&gt;
其後沒有非0的元素為止。&lt;br&gt;
(上面的方法沒有很嚴謹，因為1有可能就已經找不到0元素了，&lt;br&gt;
僅為大概的範例)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;但這樣的方法對每一個0元素都有可能需要掃瞄過一整個陣列，&lt;br&gt;
總體的時間複雜度會來到O(N^2)。&lt;/p&gt;
&lt;p&gt;有更好的方法嗎？&lt;br&gt;
我們可以先考慮：&lt;br&gt;
如果我們將原先的陣列當成額外開的ArrayList或List來使用的話呢？&lt;br&gt;
先將所有的非0值從index 0開始放入，直到沒有非0的元素為止，&lt;br&gt;
接著，和開新的空間不同，&lt;strong&gt;後面多出來的部分相當於被排開的0&lt;/strong&gt; ，&lt;br&gt;
所以我們要&lt;strong&gt;將後面的值全部設為0&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;這麼做只需要記錄當前非0的部分放到哪邊，在其後再進行補0的動作即可，&lt;br&gt;
最極端的狀況是全部都是0(即完全不用更動陣列)，&lt;br&gt;
以及全部都非0(即將原本的位置複寫相同的數字一次)；&lt;br&gt;
一旦中間有出現0的狀況，只代表其後的數字被往前挪一格，&lt;br&gt;
讀者可以紙筆稍加操作看看即可確認不會有非0的數字會被吃掉XD~&lt;/p&gt;
&lt;p&gt;我們使用了index來記錄下一個即將被寫入非0數字的位置，&lt;br&gt;
遍歷整個陣列/串列，當元素非0時，則將其寫入index的位置，&lt;br&gt;
並遞增index，其程式碼如下所示。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/7fa4f56e68afd079bb25982caaeed835.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/54c828ae9591fe19db0d48a85e71c5fb.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N), O(1)，因為最多只須掃過陣列兩次即可)&lt;/p&gt;
&lt;p&gt;「如果不要求順序保持相同的話呢？」&lt;br&gt;
(使用two pointer的方式，i由頭至尾，j由尾至頭，&lt;br&gt;
分別找到0和非0的元素進行交換，直到彼此交會即可。&lt;br&gt;
時間/空間複雜度相同但可預期因只須掃過一次陣列，有機會較快)&lt;/p&gt;
&lt;p&gt;「如果不要求要in-place呢？」&lt;br&gt;
(以python為例: &lt;br&gt;
res=[x for x in nums if x != 0]&lt;br&gt;
res += (len(nums)- len(res))*[0]&lt;br&gt;
(後面再接上對應個數的0即可)&lt;br&gt;
(時間/空間複雜度O(N),O(N))&lt;/p&gt;
&lt;p&gt;所以，有些題目簡單歸簡單，看到的時候，還是請留心限制條件，&lt;br&gt;
它有可能跟你熟悉的題目有些出入！有時候一旦限制條件不同，&lt;br&gt;
可以用的手段和時間/空間複雜度可能就會完全不同了！&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 23 Array (2)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-23-array-2/</link><pubDate>Sat, 03 Aug 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-23-array-2/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 23 Array (2)" /&gt;&lt;p&gt;&lt;strong&gt;0229. Majority Element II (Medium)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given an integer array of size &lt;em&gt;n&lt;/em&gt;, &lt;br&gt;
find all elements that appear more than &lt;code&gt;⌊ n/3 ⌋&lt;/code&gt; times.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The algorithm should run in linear time and in O(1) space.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [3,2,3]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [3]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [1,1,1,3,3,2,2,2]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [1,2]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;跟上一篇相似，這篇將出現超過二分之一改變為三分之一，&lt;br&gt;
要求求所有出現超過三分之一次數的數值，&lt;br&gt;
這使得可能超過三分之一的種類會變成2種，但並不保證一定會有2種。&lt;br&gt;
按照上一篇的摩爾投票算法的思路，&lt;br&gt;
我們可以取2個數(n1, n2)暫存，&lt;br&gt;
每次拿一個新的來檢驗並處理每三個相消的動作，&lt;br&gt;
這樣我們即可以保證留下來的會有當中超過三分之一的元素。&lt;/p&gt;
&lt;p&gt;要特別留意的是，兩個數有可能會是一致的，&lt;br&gt;
且不一定每次都存在2種超過三分之一的元素，&lt;br&gt;
所以最後我們要個別重新確認留在n1及n2上的元素，&lt;br&gt;
其個數是否有超過三分之一。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/1af85e5212b5fab8c8380f9afdb9138c.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部分，我們這邊除了同於Java的解法以外，&lt;br&gt;
再提供一個簡單的作法：使用Counter。&lt;br&gt;
利用Counter可以將一個列表轉換成Counter物件，&lt;br&gt;
儲存的方式是(key:元素 及 value: 該元素出現的次數)&lt;br&gt;
在迴圈中的取用基本上跟字典類似。&lt;br&gt;
只要檢查每個元素出現次數是否大於三分之一的數量即可加至結果。&lt;/p&gt;
&lt;p&gt;(請留意如果認真按照題目要求的話，&lt;br&gt;
這個解法因為會佔用額外&lt;strong&gt;O(n)&lt;/strong&gt; 空間，&lt;br&gt;
故不是一個在O(1)空間內可以完成的算法。)&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/37250d6e8e15407b7995ff8db1e78b91.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(n), O(1)。&lt;br&gt;
要經過整個陣列兩次，且額外並沒有需求常數次數以外的空間)&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 22 Array (1)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-22-array-1/</link><pubDate>Wed, 31 Jul 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-22-array-1/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 22 Array (1)" /&gt;&lt;p&gt;&lt;strong&gt;0169. Majority Element (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given an array of size &lt;em&gt;n&lt;/em&gt;, find the majority element. The majority element is the element that appears &lt;strong&gt;more than&lt;/strong&gt; &lt;code&gt;⌊ n/2 ⌋&lt;/code&gt; times.&lt;/p&gt;
&lt;p&gt;You may assume that the array is non-empty and the majority element always exists in the array.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [3,2,3]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [2,2,1,1,1,2,2]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;嗨，大家今天過得好嗎？歡迎回到軟工宅宅(誤)。&lt;br&gt;
接下來的幾題我們會著墨一下有關陣列(Array)或列表(List)相關的內容。&lt;/p&gt;
&lt;p&gt;題目給定了一個長度為n的陣列，&lt;br&gt;
已知當中有一個majority element(佔大多數的元素)，&lt;br&gt;
這個數的個數會多過於&lt;code&gt;⌊ n/2 ⌋&lt;/code&gt;。&lt;br&gt;
(此符號代表向下取整數，如&lt;code&gt;⌊ 5/2 ⌋&lt;/code&gt;=2。&lt;br&gt;
別忘了是more than，所以如果n是5的話，&lt;br&gt;
代表majority element至少要有3個)&lt;/p&gt;
&lt;p&gt;題目還貼心地告訴我們，可以假定陣列不是空的，&lt;br&gt;
且一定存在majority element，所以這邊可以省掉一些常用的檢查。&lt;/p&gt;
&lt;p&gt;怎麼解這題呢？&lt;br&gt;
一般來說的直覺可能會想使用HashMap來解(Python則用dict)，&lt;br&gt;
將每個數塞入HashMap/字典中，最後找最大的那個數就是了。&lt;br&gt;
這麼做的時間複雜度為O(n)，空間複雜度亦為O(n)，&lt;br&gt;
因為插入耗費的時間為O(1)，插入n個數即為O(n)，&lt;br&gt;
同時，我們只能保證最多有n - &lt;code&gt;⌊ n/2 ⌋&lt;/code&gt;的不同種類的數，&lt;br&gt;
所以空間上還是保持在O(n)的複雜度。&lt;br&gt;
在中途過程中在去檢驗是否有超過半數的element也可以，&lt;br&gt;
但由於過程不保證會先碰到超過半數，所以額外檢驗的時間，&lt;br&gt;
和省下來後面可能不用做完的時間相比，是不能肯定誰效率比較好的。&lt;/p&gt;
&lt;p&gt;那麼，有沒有比較節省空間的做法呢？&lt;br&gt;
有的！這裡介紹一個演算法，全名叫做：&lt;br&gt;
Boyer–Moore majority vote algorithm(摩爾投票算法)&lt;br&gt;
這個算法的核心在於，&lt;br&gt;
&lt;strong&gt;刪去一個數列中的兩個不同的數字，不會影響該數列的majority element。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假想有一群人要投票，候選人有A、B、C，假設A已知會過半數的話，&lt;br&gt;
任取其中2個人取消他們的投票資格，會有以下的狀況：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;被取消資格的是B跟C -&amp;gt; 顯然A還是過半數(而且比例更高了XD)&lt;/li&gt;
&lt;li&gt;被取消資格的是(A, B)或(A, C) -&amp;gt; 一個投A的和一個不投A的同步被排除，所以無法改變A會過半數的狀況。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;同理，在不只3個候選人(數字)的時候，每次取2個人取消投票資格(移除)，亦無法改變投票結果(A還是會是majority element)。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;註：&lt;br&gt;
所以我們可以知道，當你跟你的家人政治立場不同時，&lt;br&gt;
只有兩個人的狀況下都不去投票是沒有用的，&lt;br&gt;
有用的方式是在&lt;strong&gt;投票前夕帶著跟你立場相反的家人們出國去玩&lt;/strong&gt; ，&lt;br&gt;
&lt;strong&gt;多於1人時，每多一個人你就多賺一張選票差距&lt;/strong&gt; ，但你的荷包可能會哭。&lt;br&gt;
(不要說是我教的！)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;依此，我們可以使用下列的方式來進行陣列運算：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;取出第一個數放到一個暫存的變數(res)，&lt;br&gt;
將計數器(cnt)設定為1，代表這個數出現1次。&lt;/li&gt;
&lt;li&gt;取出下一個數nums[i]，如果和res相等，則將計數器+1；&lt;br&gt;
如果和res不同，且計數器&amp;gt;0時，將計數器-1；(代表取這兩個數成對移除)&lt;br&gt;
如果和res不同但是計數器=0時，將res更改為nums[i]並將計數器+1(代表res已經用完了，現在還沒被移除的是nums[i])&lt;/li&gt;
&lt;li&gt;反覆進行步驟2直到陣列結尾，剩下的res即為答案。&lt;br&gt;
(因為兩兩移除到最後一定是非majority element的先被移光)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/58ac9d04e78f53491f0a22498aa39637.js"&gt;&lt;/script&gt;
&lt;p&gt;還有另一種作法，是將陣列進行排序，&lt;br&gt;
無論如何majority element一定會通過中間的位置。&lt;br&gt;
這種方式的時間複雜度為O(nlogn)，空間複雜度視你的呼叫方式而定，&lt;br&gt;
可能是O(1)也可能是O(n)(將排序的結果放到別的地方的話)&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/b0f289f5419eb98e9acb1ea407dd5301.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(n), O(1)，除了一些變數以外我們沒有使用到額外的空間)&lt;/p&gt;
&lt;p&gt;「各方法的優劣為何？」&lt;br&gt;
(可以參照&lt;a class="link" href="https://leetcode.com/problems/majority-element/solution/" target="_blank" rel="noopener"
&gt;Solution&lt;/a&gt;的頁面，這篇作者分析的內容很完整)&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item></channel></rss>