<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hash Table on 跟著 Desolve 學程式</title><link>https://desolve.pages.dev/tags/hash-table/</link><description>Recent content in Hash Table on 跟著 Desolve 學程式</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Fri, 08 Jan 2021 00:00:00 +0800</lastBuildDate><atom:link href="https://desolve.pages.dev/tags/hash-table/index.xml" rel="self" type="application/rss+xml"/><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學演算法 - 94 Hash Table (10)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-94-hash-table-10/</link><pubDate>Sun, 24 May 2020 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-94-hash-table-10/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 94 Hash Table (10)" /&gt;&lt;p&gt;&lt;strong&gt;0438. Find All Anagrams in a String (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given a string &lt;strong&gt;s&lt;/strong&gt; and a ** non-empty** string ** p**, find all the start indices of ** p**’s anagrams in ** s**.&lt;/p&gt;
&lt;p&gt;Strings consist of lowercase English letters only and the length of both strings &lt;strong&gt;s&lt;/strong&gt; and ** p** will not be larger than 20,100.&lt;/p&gt;
&lt;p&gt;The order of output does not matter.&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:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s: &amp;#34;cbaebabacd&amp;#34; p: &amp;#34;abc&amp;#34;
&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;/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:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[0, 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;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;Explanation:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The substring with start index = 0 is &amp;#34;cba&amp;#34;, which is an anagram of &amp;#34;abc&amp;#34;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The substring with start index = 6 is &amp;#34;bac&amp;#34;, which is an anagram of &amp;#34;abc&amp;#34;.
&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:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s: &amp;#34;abab&amp;#34; p: &amp;#34;ab&amp;#34;
&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;/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:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[0, 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;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;Explanation:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The substring with start index = 0 is &amp;#34;ab&amp;#34;, which is an anagram of &amp;#34;ab&amp;#34;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The substring with start index = 1 is &amp;#34;ba&amp;#34;, which is an anagram of &amp;#34;ab&amp;#34;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The substring with start index = 2 is &amp;#34;ab&amp;#34;, which is an anagram of &amp;#34;ab&amp;#34;.
&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;給定一個字串s及一個非空的字串p，&lt;br&gt;
試找出所有在p在s內的所有異位構詞(anagram)的起始的索引值。&lt;br&gt;
本題當中的字串僅含小寫英文字母，且s和p的長度分別不會大於20, 100.&lt;br&gt;
(但不用在意輸出的順序)&lt;/p&gt;
&lt;p&gt;我們先前已經提過anagram的定義了，詳情可見&lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-41-hash-table-2-944fd5db94d" target="_blank" rel="noopener"
&gt;&lt;strong&gt;0242. Valid Anagram (Easy)&lt;/strong&gt; &lt;/a&gt;。簡單來說，anagram是指說兩個字串是由相同的字元組成的，&lt;br&gt;
只有順序可能不同而已。&lt;/p&gt;
&lt;p&gt;我們先假設我們拿到兩個字串，要檢查它們是不是互為anagram，&lt;br&gt;
端看它們的’a’出現的次數，’b’出現的次數，’c’出現的次數&amp;hellip;, &lt;br&gt;
&amp;lsquo;z&amp;rsquo;出現的次數是否相同即可。&lt;br&gt;
這個儲存兩者出現的次數，可以使用HashTable來計算，&lt;br&gt;
而且由於我們要分的內容很簡單，所以只需要小寫字母個數26個即可，&lt;br&gt;
也就是Java可以使用一個長度為26的一維陣列，&lt;br&gt;
Python可以使用串列，要使用字典也行(相當於HashMap)。&lt;/p&gt;
&lt;p&gt;回到我們的問題，我們想要在s當中找到一個子字串，&lt;br&gt;
使得這個子字串和p互為anagram，&lt;br&gt;
這時候應該可以先將p的各字母出現次數先行記錄下來。&lt;br&gt;
接下來&lt;strong&gt;從s的index 0開始往右&lt;/strong&gt; ，一路計算&lt;strong&gt;走到可以取p的長度為止，&lt;br&gt;
如果這段能和p的組成內容相同，那就可以記做其中一個解。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;為了要比對是否組成內容相同，&lt;br&gt;
我們可以將每次看到的字母&lt;strong&gt;從p的hash table中扣除掉&lt;/strong&gt; ，&lt;br&gt;
當所有整個hash table都歸零的時候，我們就知道當前的組成相同了。&lt;br&gt;
但為了不需要每次都檢查整個hash table，&lt;br&gt;
我們可以先行設定一個cnt變數，其值等於p的長度。&lt;br&gt;
每次碰到可以扣除的組成就將cnt遞減，&lt;br&gt;
&lt;strong&gt;這樣當cnt為0且當前長度為和p長度相等時，就知道取得一個解了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;接下來，我們需要一個left和一個right的索引值來記錄。&lt;br&gt;
由於長度固定就這麼長，當我們已經來到左右距離p的長度時，&lt;br&gt;
我們可以&lt;strong&gt;將left和right各自往右移動一格&lt;/strong&gt; 。&lt;br&gt;
同時left移出&lt;/p&gt;
&lt;p&gt;舉例來說假設：&lt;br&gt;
s: “e&lt;strong&gt;cba&lt;/strong&gt; eba&lt;strong&gt;bac&lt;/strong&gt; d” p: “abc” &lt;br&gt;
(這邊將Example 1前面多加一個字元比較容易看出不同)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;(left, right, cnt) : (0, 0, 3) -&amp;gt; (0, 1, 3) -&amp;gt; (0, 2, 2) -&amp;gt; (0, 3, 1)&lt;br&gt;
沿路會檢查&amp;rsquo;e&amp;rsquo;, &amp;lsquo;c&amp;rsquo;, &amp;lsquo;b&amp;rsquo;，每次碰到的字母會從p的hash table中扣掉，&lt;br&gt;
不過cnt這樣只會降到1，表示&lt;strong&gt;沒有成立anagram&lt;/strong&gt; 。&lt;/li&gt;
&lt;li&gt;(left, right, cnt) : (0, 3, 1) -&amp;gt; (1, 4, 0)&lt;br&gt;
將left往右移一格，’e’就出範圍外了(hash table要加回來)，&lt;br&gt;
接著right往右移一格，’a’進入範圍內，且符合p的hash table擁有的子母，&lt;br&gt;
&lt;strong&gt;所以cnt會從1降為0，同時範圍長度相符，&lt;br&gt;
表示這是其中一個解&lt;/strong&gt;，將1加入到我們的答案範圍中。&lt;/li&gt;
&lt;li&gt;(left, right, cnt) : (1, 4, 0) -&amp;gt; (2, 5, 1) -&amp;gt; (3, 6, 2) -&amp;gt; (4, 7, 3)&lt;br&gt;
依序移出範圍，&lt;strong&gt;如果發現加上去前hash table該值有≥0的話，&lt;br&gt;
表示有移出p原有的字母，所以我們要將cnt進行遞增&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;(left, right, cnt) : (4, 7, 3) -&amp;gt; (5, 8, 2) -&amp;gt; (6, 9, 1) -&amp;gt; (7, 10, 0)&lt;br&gt;
同樣經歷了一個cnt等於0且長度等於p的範圍，&lt;br&gt;
將&lt;strong&gt;7&lt;/strong&gt; 加入答案當中。&lt;/li&gt;
&lt;li&gt;(left, right, cnt) : (8, 11, 1) -&amp;gt; right超過，停止檢查。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以按上面這個範例的output就會是[1, 7]。&lt;/p&gt;
&lt;p&gt;這個題目由於我們中途開始的left和right呈現一個固定距離的狀態，&lt;br&gt;
只是隨著遞增&lt;strong&gt;滑動&lt;/strong&gt; ，所以這種固定窗口大小並且移動的方式，&lt;br&gt;
一般稱為&lt;strong&gt;Sliding Window&lt;/strong&gt; 。&lt;br&gt;
(也可以視為Two Pointer在某種狀態的條件限定)&lt;/p&gt;
&lt;p&gt;依此，我們可以寫成程式碼如下：&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;p&gt;Java的部分，參考了一位leetcode上的解法，&lt;br&gt;
我們使用一個ArrayList來儲存我們的答案，&lt;br&gt;
並且前期的檢查可以分別檢查s, p是否為null或空，&lt;br&gt;
以及s的長度不能小於p的長度才行(不然要怎麼組對吧XD)&lt;/p&gt;
&lt;p&gt;接著，我們使用一個長度26的一維陣列，&lt;br&gt;
也可以使用ASCII長度256直接存，我們使用26的長度時，&lt;br&gt;
index使用c-’a’即可對應。&lt;/p&gt;
&lt;p&gt;初始化left, right, count後，迴圈條件設定為right還沒有超出去範圍。&lt;br&gt;
迴圈內的判斷式則利用++和&amp;ndash;的特性，&lt;br&gt;
(放後面時會先進行完整個操作才遞增/遞減)，&lt;br&gt;
其他的重點做法跟前面的描述是一樣的，&lt;br&gt;
讀者可以再自己嘗試在紙上推導一次，會更加清楚。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/4f0f9cb395c0e50c50c1e8c1663c3669.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;Python的部分我們示範使用字典來處理，&lt;br&gt;
由於我們不想要每次在取值時都先檢查值有沒有存在的問題，&lt;br&gt;
(不論是get或者是用[]取值，字典都不會有預設值)&lt;br&gt;
&lt;strong&gt;所以這邊先行將26個字母的對應都置入0，後續就不需要再檢查了。&lt;/strong&gt; 其它的部分跟Java的寫法基本相同，只是沒有++跟- -能用而已XD!&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/843bd02ae84e41fa25f51d938e2ddd3b.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;
空間複雜度如果要算上答案的部分的話則為O(N)，N為s的長度)&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=VE9Q5VE" target="_blank" rel="noopener"
&gt;** https://hiskio.com/courses/319?promo_code=VE9Q5VE**&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 89 Hash Table (9)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-89-hash-table-9/</link><pubDate>Sun, 01 Mar 2020 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-89-hash-table-9/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 89 Hash Table (9)" /&gt;&lt;p&gt;&lt;strong&gt;1346. Check If N and Its Double Exist (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;arr&lt;/code&gt; of integers, check if there exist two integers &lt;code&gt;N&lt;/code&gt; and &lt;code&gt;M&lt;/code&gt; such that &lt;code&gt;N&lt;/code&gt; is the double of &lt;code&gt;M&lt;/code&gt; ( i.e. &lt;code&gt;N = 2 * M&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;More formally check if there exist two indices &lt;code&gt;i&lt;/code&gt; and &lt;code&gt;j&lt;/code&gt; such that :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;i != j&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0 &amp;lt;= i, j &amp;lt; arr.length&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;arr[i] == 2 * arr[j]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&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: arr = [10,2,5,3]
&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: N = 10 is the double of M = 5,that is, 10 = 2 * 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;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 = [7,1,14,11]
&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: N = 14 is the double of M = 7,that is, 14 = 2 * 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="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 = [3,1,7,11]
&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: In this case does not exist N and M, such that N = 2 * M.
&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;2 &amp;lt;= arr.length &amp;lt;= 500&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-10^3 &amp;lt;= arr[i] &amp;lt;= 10^3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一組整數陣列，檢查當中是否存在兩個數N, M使得N = 2 * M。&lt;br&gt;
(留意不可使用重複的index)&lt;/p&gt;
&lt;p&gt;乍看之下有沒有覺得一陣熟悉？&lt;br&gt;
沒錯，LeetCode最開始的第一題&lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-1-400da76b51b4" target="_blank" rel="noopener"
&gt;&lt;strong&gt;0001.Two Sum&lt;/strong&gt; &lt;/a&gt;的套路，&lt;br&gt;
跟這個非常的相似，只不過從兩數相加等於固定數，&lt;br&gt;
變成一個是另一個的兩倍。另一方面，我們只要將存在與否輸出，&lt;br&gt;
所以&lt;strong&gt;不用記錄是什麼配對&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;那麼，按照先前的做法，我們需要做的事情是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;檢查&lt;strong&gt;現在的值有沒有符合之前的配對&lt;/strong&gt; ，若有，就直接回傳True即可。&lt;br&gt;
 (先前使用HashMap/Dictionary，這次可以使用HashSet/Set)&lt;/li&gt;
&lt;li&gt;將&lt;strong&gt;當前的值對應到的配對&lt;/strong&gt; 擺進Set當中，&lt;br&gt;
由於當前的值x對應到之後的y有可能是 x = 2 * y 或 y = 2 * x，&lt;br&gt;
所以我們要一次將兩種可能都放進去。&lt;br&gt;
這樣子整個Set的總大小會變成2N，但不會影響檢查速度。&lt;br&gt;
(因為HashSet/Set同樣是使用hash function的機制)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全部檢查完，仍然沒有符合的狀況，則回傳False。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;依此，寫成程式碼如下：&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;p&gt;Java的部分，由於限制資料型態，&lt;br&gt;
要留意處理除以2的部分，不能讓它自動做整數除法，&lt;br&gt;
所以&lt;strong&gt;先檢查能否被2整除，可以的狀況才將其加入Set中&lt;/strong&gt; 。&lt;br&gt;
(使用&lt;strong&gt;HashSet&lt;/strong&gt; ，檢查是否存在值使用&lt;strong&gt;contains()&lt;/strong&gt; ，&lt;strong&gt;add()&lt;/strong&gt; 來加入元素)&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/5b1b9fe8c5063daa86b363ab7a1ed32c.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;Python的部分，由於/2直接會變成float，沒有特別被限制，&lt;br&gt;
我們可以直接選擇加入而略過檢查的部分。&lt;br&gt;
(反正小數點也不會被對到嘛XD)&lt;br&gt;
(使用&lt;strong&gt;set()&lt;/strong&gt; 開一個Set，&lt;strong&gt;in / not in&lt;/strong&gt; 來檢查，並用&lt;strong&gt;update&lt;/strong&gt; 來加入多個元素)&lt;br&gt;
(先處理存在或先處理不存在的狀況都可以，看自己的喜好)&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/1dd76266d42ee1fa49083750c5a97528.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(N)，記得乘以2倍空間上是常數，不要講O(2N)歐XD)&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=VE9Q5VE" target="_blank" rel="noopener"
&gt;** https://hiskio.com/courses/319?promo_code=VE9Q5VE**&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 88 Hash Table (8)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-88-hash-table-8/</link><pubDate>Fri, 21 Feb 2020 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-88-hash-table-8/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 88 Hash Table (8)" /&gt;&lt;p&gt;&lt;strong&gt;0575. Distribute Candies (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given an integer array with ** even** length, where different numbers in this array represent different ** kinds** of candies. Each number means one candy of the corresponding kind. You need to distribute these candies ** equally** in number to brother and sister. Return the maximum number of ** kinds** of candies the sister could gain.&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: candies = [1,1,2,2,3,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:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;There are three different kinds of candies (1, 2 and 3), and two candies for each kind.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Optimal distribution: The sister has candies [1,2,3] and the brother has candies [1,2,3], too.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The sister has three different kinds of candies.
&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: candies = [1,1,2,3]
&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: For example, the sister has candies [2,3] and the brother has candies [1,1].
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The sister has two different kinds of candies, the brother has only one kind of candies.
&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;The length of the given array is in the range [2, 10,000], and will be even.&lt;/li&gt;
&lt;li&gt;The number in given array is in range [-100,000, 100,000].&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;什麼？題目也偏女生嗎(大誤)&lt;/p&gt;
&lt;p&gt;題目內文基本上已經講得相當清楚了，&lt;br&gt;
接下來問題就來到究竟我們要怎麼知道種類有多少種不同呢？&lt;br&gt;
首先，如果每顆糖果都不同種類，女生最多能拿的也只有&lt;strong&gt;一半&lt;/strong&gt; ，&lt;br&gt;
所以能拿到的種類上限會受限於&lt;strong&gt;candies的總數除以2&lt;/strong&gt; 。&lt;br&gt;
這個是大前提，我們先將它放在一邊。&lt;/p&gt;
&lt;p&gt;那麼，如果&lt;strong&gt;種類總數比candies總數的一半小&lt;/strong&gt; 呢？&lt;br&gt;
簡單的想法就是發糖果的時候，&lt;strong&gt;每次遇到沒看過的種類，&lt;br&gt;
就先記起來&lt;/strong&gt;，藉此將整個種類數計數過一遍。&lt;br&gt;
(或者你也可以想成&lt;strong&gt;每次看到沒看過的種類&lt;/strong&gt; 要優先給女生，&lt;br&gt;
給到女生&lt;strong&gt;拿滿&lt;/strong&gt; 或&lt;strong&gt;沒有新的種類&lt;/strong&gt; 為止，兩個思考的模式和條件其實差不多。)&lt;/p&gt;
&lt;p&gt;要記錄某種糖果的出現數量，&lt;br&gt;
自然會想到HashTable/HashSet/Dictionary這類的東西，&lt;br&gt;
但由於題目有提到種類是從-100000~100000，&lt;br&gt;
所以其實我們可以開出一個長度為200001的陣列/串列，&lt;br&gt;
直接當成Hash Table來使用，只要位移個100000即可。&lt;br&gt;
(陣列/串列要從0開始)&lt;/p&gt;
&lt;p&gt;因此，我們每次就可以從candies中依序取出一個數字，&lt;br&gt;
將Hash Table內的對應位置進行遞增，再看看加完後是否剛好是1，&lt;br&gt;
是1就代表這是新種類的糖果，所以要將種類的變數加1。&lt;/p&gt;
&lt;p&gt;最後再回頭比較種類的數量，跟糖果的總數的一半，&lt;br&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/de3b48a33603ea54a9137fcfb58e8768.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部分，我們也可以用set的方式取得不重複的種類，&lt;br&gt;
再取其len()即可得到不重複的種類數量。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/264600a62b62ab38307a7df607d87be3.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;
會固定要開出一個200001的空間，這個可以再直接用說的。)&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=VE9Q5VE" target="_blank" rel="noopener"
&gt;** https://hiskio.com/courses/319?promo_code=VE9Q5VE**&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 86 Hash Table (7)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-86-hash-table-7/</link><pubDate>Wed, 05 Feb 2020 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-86-hash-table-7/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 86 Hash Table (7)" /&gt;&lt;p&gt;&lt;strong&gt;1331. Rank Transform of an 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;arr&lt;/code&gt;, replace each element with its rank.&lt;/p&gt;
&lt;p&gt;The rank represents how large the element is. The rank has the following rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rank is an integer starting from 1.&lt;/li&gt;
&lt;li&gt;The larger the element, the larger the rank. If two elements are equal, their rank must be the same.&lt;/li&gt;
&lt;li&gt;Rank should be as small as possible.&lt;/li&gt;
&lt;/ul&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: arr = [40,10,20,30]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [4,1,2,3]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: 40 is the largest element. 10 is the smallest. 20 is the second smallest. 30 is the third smallest.
&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 = [100,100,100]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [1,1,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: Same elements share the same rank.
&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 = [37,12,28,9,100,56,80,5,12]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [5,3,4,2,8,6,7,1,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="constraints"&gt;Constraints
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0 &amp;lt;= arr.length &amp;lt;= 10^9&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-10^9 &amp;lt;= arr[i] &amp;lt;= 10^9&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個陣列，將其依照大小順序排出rank。&lt;br&gt;
(由1開始，大小相同則相同rank，數字越大，其rank則越大)&lt;/p&gt;
&lt;p&gt;由於我們需要按照大小相同來排定rank，所以顯然我們需要將其排序後，&lt;br&gt;
才能知道誰應該在第幾個。對於這樣子的題目，&lt;br&gt;
一般而言我們不需要自己實作排序的過程，除非面試官要求，&lt;br&gt;
否則說明清楚你使用了排序即可；&lt;br&gt;
不要忘記對於沒有特別安排的資料結構，&lt;br&gt;
一般程式語言所使用的排序法基本上都是&lt;strong&gt;O(N log N)&lt;/strong&gt; 的時間複雜度，&lt;br&gt;
所以最後在問複雜度時記得納入考量。&lt;/p&gt;
&lt;p&gt;既然我們需要取代原先的陣列，所以我們必須另外增加一組記憶體空間，&lt;br&gt;
用來存放排序的狀態。存放好以後，應該要怎麼去記錄呢？&lt;br&gt;
由於相同的數字要擁有相同的rank，對於存取和讀出擁有最快的複雜度的，&lt;br&gt;
就是Hash Table了！我們可以先&lt;strong&gt;檢查當下該數字是否已經放入對應&lt;/strong&gt; ，&lt;br&gt;
若還沒有放入對應，則需要寫入(number, rank)的對應。&lt;br&gt;
這時候rank是多少呢？應該要將&lt;strong&gt;已經置入的配對數量+1&lt;/strong&gt; 來計算。&lt;br&gt;
(因為代表現在已經給到多少數量的rank了)&lt;br&gt;
都放完以後，再依序將陣列中的每個值作為key，&lt;br&gt;
來從Hash Table得到其對應的rank(value)，再覆蓋掉即可。&lt;/p&gt;
&lt;p&gt;依此，寫成程式碼：&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;p&gt;Java在增加新的記憶體儲存一份陣列時，可以使用&lt;strong&gt;Arrays.copyOf()&lt;/strong&gt; 。&lt;br&gt;
(後面加length可以指定複製的總長度)&lt;br&gt;
使用HashMap來進行存放，並且用&lt;strong&gt;putIfAbsent(key, value)&lt;/strong&gt; ，&lt;br&gt;
僅在&lt;strong&gt;不存在對應時才進行寫入。&lt;br&gt;
最後再利用HashMap.get()來一一取得對應rank並寫入。&lt;/strong&gt;&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/c26de6387245a116951412cf2208820f.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;Python的部分，我們可以直接使用sorted(arr)取得一份新的串列。&lt;br&gt;
也可以使用&lt;strong&gt;list.copy()&lt;/strong&gt; 或者&lt;strong&gt;arr[:]&lt;/strong&gt; 的方式來取得複製的串列。&lt;br&gt;
&lt;strong&gt;請注意 &amp;ldquo;sArr = arr&amp;rdquo; 和 &amp;ldquo;sArr = arr[:]&amp;ldquo;意義上是不同的，&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;後者才是完整複製一份arr的串列&lt;/strong&gt; ，前者是新增了一個變數名稱，&lt;br&gt;
但其記憶體位址依舊是指向到arr的！(也就是後者並沒有進行複製)&lt;/p&gt;
&lt;p&gt;Java中使用HashMap，在Python中則用Dictionary達到，&lt;br&gt;
而對應到putIfAbsent的函式則是&lt;strong&gt;setdefault&lt;/strong&gt; 。&lt;br&gt;
(也可以用&lt;strong&gt;if&lt;/strong&gt; ** a not in rk: rk[a] = len(rk) + 1**)&lt;/p&gt;
&lt;p&gt;最後，&lt;strong&gt;使用map函式來一一得到arr對應到rk.get的內容。&lt;/strong&gt;&lt;br&gt;
(即每次從arr依序取出元素再代入到rk.get內)&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/e63f544f4b1d7d58cdfcbc7c6fc96b14.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(NlogN)/O(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;/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=VE9Q5VE" target="_blank" rel="noopener"
&gt;** https://hiskio.com/courses/319?promo_code=VE9Q5VE**&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 79 Hash Table (6)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-79-hash-table-6/</link><pubDate>Tue, 31 Dec 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-79-hash-table-6/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 79 Hash Table (6)" /&gt;&lt;p&gt;&lt;strong&gt;0383. Ransom Note (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines; otherwise, it will return false.&lt;/p&gt;
&lt;p&gt;Each letter in the magazine string can only be used once in your ransom note.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
You may assume that both strings contain only lowercase letters.&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;canConstruct(&amp;#34;a&amp;#34;, &amp;#34;b&amp;#34;) -&amp;gt; false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;canConstruct(&amp;#34;aa&amp;#34;, &amp;#34;ab&amp;#34;) -&amp;gt; false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;canConstruct(&amp;#34;aa&amp;#34;, &amp;#34;aab&amp;#34;) -&amp;gt; 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="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;繼&lt;strong&gt;時空旅人買賣股票(&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-37-dynamic-programming-8-f60ad427d76d" target="_blank" rel="noopener"
&gt;&lt;strong&gt;0121&lt;/strong&gt; &lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt; 及&lt;strong&gt;闖空門教學(&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-28-dynamic-programming-6-8e5a81a8437d" target="_blank" rel="noopener"
&gt;&lt;strong&gt;0198&lt;/strong&gt; &lt;/a&gt;&lt;strong&gt;,&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-29-dynamic-programming-7-8e3aedb07ca3" target="_blank" rel="noopener"
&gt;** 0213**&lt;/a&gt;** )&lt;strong&gt;後，&lt;br&gt;
我們這次要來寫&lt;/strong&gt;勒索信** 啦！&lt;br&gt;
有沒有覺得這一系列很實用？(大誤)&lt;/p&gt;
&lt;p&gt;勒索信的構成很簡單，就是每個從雜誌上的字，&lt;br&gt;
剪下來以後&lt;strong&gt;只能用一次&lt;/strong&gt; ，要用這些字去組出勒索信的內容。&lt;/p&gt;
&lt;p&gt;所以這個就很簡單就可以處理啦！&lt;br&gt;
我們可以先將所有雜誌上的字分門別類，&lt;br&gt;
這邊還很貼心告訴我們&lt;strong&gt;全部只有小寫字母&lt;/strong&gt; ，&lt;br&gt;
所以分成a-z即可，計算總共有的素材數量。&lt;/p&gt;
&lt;p&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"&gt;Java
&lt;/h3&gt;&lt;p&gt;Java的部分，其實如要扣掉一些條件，&lt;br&gt;
可以先檢查兩者的長度，magazine長度比較小時肯定無法完成勒索信。&lt;br&gt;
由於題目的給定，我們可以不用HashMap，&lt;br&gt;
僅用一個長度26的陣列來處理，index則用&lt;strong&gt;c - ‘a’&lt;/strong&gt; 來計算，&lt;br&gt;
留意使用&amp;ndash;table[c-&amp;lsquo;a&amp;rsquo;]時由於&lt;strong&gt;先進行遞減&lt;/strong&gt; ，所以檢查條件是小於0。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/8e24d2e832ae7d1379d1d485375f890a.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;Python的部分，可以用dictionary作到類似的事情。&lt;br&gt;
(list也可以，不過要自行用ord來轉換，和Java不同)&lt;br&gt;
當然，我們也可以使用Counter或count來做更迅速的計算。&lt;br&gt;
(註解提供了另外兩種leetcode上別人的解法)&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/d8fbf7b9d72a6292d129de62f4ac5add.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(len(ransomNote) + len(magazine))/O(1))&lt;br&gt;
(空間複雜度因為依題目提示，key值固定最多26，&lt;br&gt;
所以不因字串長而改變。)&lt;/p&gt;
&lt;p&gt;「如果要求含大小寫/大小寫可混用/含標點符號等狀況呢？」&lt;br&gt;
(依照所需使用HashMap或Dictionary，&lt;br&gt;
並將共用的部分利用他們相減的距離歸到同類)&lt;br&gt;
(在ASCII Code上，&lt;strong&gt;‘a’-’A’ == 32&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優惠(接下來快要漲成下個價格啦XD)：&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學演算法 - 76 Hash Table (5)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-76-hash-table-5/</link><pubDate>Sat, 21 Dec 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-76-hash-table-5/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 76 Hash Table (5)" /&gt;&lt;p&gt;&lt;strong&gt;0290. Word Pattern (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given a &lt;code&gt;pattern&lt;/code&gt; and a string &lt;code&gt;str&lt;/code&gt;, find if &lt;code&gt;str&lt;/code&gt; follows the same pattern.&lt;/p&gt;
&lt;p&gt;Here &lt;strong&gt;follow&lt;/strong&gt; means a full match, such that there is a bijection between a letter in &lt;code&gt;pattern&lt;/code&gt; and a ** non-empty** word in &lt;code&gt;str&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: pattern = &amp;#34;abba&amp;#34;, str = &amp;#34;dog cat cat dog&amp;#34;
&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;/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:pattern = &amp;#34;abba&amp;#34;, str = &amp;#34;dog cat cat fish&amp;#34;
&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: pattern = &amp;#34;aaaa&amp;#34;, str = &amp;#34;dog cat cat dog&amp;#34;
&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-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;/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: pattern = &amp;#34;abba&amp;#34;, str = &amp;#34;dog dog dog dog&amp;#34;
&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;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;br&gt;
You may assume &lt;code&gt;pattern&lt;/code&gt; contains only lowercase letters, and &lt;code&gt;str&lt;/code&gt; contains lowercase letters that may be separated by a single space.&lt;/p&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個pattern和一個字串str，檢查str是否遵循pattern的模式。&lt;br&gt;
簡單來說，就是str的每一段字的重複或不重複模式，&lt;br&gt;
都要能被pattern裡的&amp;quot;abba&amp;quot;這樣的&lt;strong&gt;每個字母去對應&lt;/strong&gt; 的方式來表達出來。&lt;br&gt;
看到這邊，有沒有覺得很像LeetCode最開始的那個&lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-1-400da76b51b4" target="_blank" rel="noopener"
&gt;Two Sum&lt;/a&gt;?&lt;br&gt;
我們每次想要將一個pattern內的字母去對應到str的一段字串，&lt;br&gt;
而重複的狀況應該要有相同的對應。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;那不就是key-value的對應方式嗎?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以想法就很簡單了：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;建立一個Hash Table名為map(Java的HashMap或Python的Dictionary)&lt;/li&gt;
&lt;li&gt;先檢查&lt;strong&gt;pattern的段數和str的段數是否相同&lt;/strong&gt; ，&lt;strong&gt;若否則直接回傳false&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依序按段取出&lt;/strong&gt; pattern和對應的str的分段，檢查以下性質：&lt;br&gt;
&lt;strong&gt;(下面pattern均作為key，str的分段均作為value)&lt;/strong&gt;&lt;br&gt;
若key不存在且value不存在-&amp;gt;將**(key, value)** 放入map&lt;br&gt;
若key不存在且value存在-&amp;gt;回傳&lt;strong&gt;false&lt;/strong&gt; (** 表示別人先對應到它了**)&lt;br&gt;
若key存在且value不對-&amp;gt;回傳&lt;strong&gt;false&lt;/strong&gt; (** 表示該key已經被占用掉**)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;請留意後面的兩個false的狀況，&lt;br&gt;
我們可以對照&lt;strong&gt;Example 2&lt;/strong&gt; 跟&lt;strong&gt;Example 3&lt;/strong&gt; ，&lt;br&gt;
因為有些可能是前面某個key或某個value已經達成對應關係了，&lt;br&gt;
後續如果出現對不上的狀況，就表示整個對應關係無法成立囉！&lt;/p&gt;
&lt;p&gt;依此，寫成程式碼如下：&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;p&gt;Java的部分，&lt;br&gt;
可以使用HashMap的containsKey/containsValue/get，&lt;br&gt;
以及字串的split/equals函式，來協助判斷的工作。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/8f30742455b74157505537e719e1f9ab.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;Python方面，同樣有split可以使用，&lt;br&gt;
其他使用dict的in/not in及values()等簡單的存取方式即可。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/409bf9bf6b7863af7302c72a4825e032.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(N)，準確來說應該是看len(str)來決定N)&lt;/p&gt;
&lt;p&gt;「如果限制使用split呢？」&lt;br&gt;
(進行依字元掃瞄過整個陣列，碰到空白再輸出成字串(list或arraylist)即可)&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學演算法 - 71 Hash Table (4)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-71-hash-table-4/</link><pubDate>Tue, 26 Nov 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-71-hash-table-4/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 71 Hash Table (4)" /&gt;&lt;p&gt;&lt;strong&gt;0205. Isomorphic Strings (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given two strings *&lt;strong&gt;s&lt;/strong&gt; * and *&lt;strong&gt;t&lt;/strong&gt; *, determine if they are isomorphic.&lt;/p&gt;
&lt;p&gt;Two strings are isomorphic if the characters in *&lt;strong&gt;s&lt;/strong&gt; * can be replaced to get *&lt;strong&gt;t&lt;/strong&gt; *.&lt;/p&gt;
&lt;p&gt;All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.&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: s = &amp;#34;egg&amp;#34;, t = &amp;#34;add&amp;#34;
&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;/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: s = &amp;#34;foo&amp;#34;, t = &amp;#34;bar&amp;#34;
&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: s = &amp;#34;paper&amp;#34;, t = &amp;#34;title&amp;#34;
&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="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定兩個字串s和t，試判斷它們是否同構(isomorphic)&lt;br&gt;
若s和t同構，表示可以透過將s中的相同的字元轉換成另一個字元，&lt;br&gt;
保有其順序，使得在轉換過後的s和t完全一樣。&lt;br&gt;
&lt;strong&gt;兩個不同的字元不可映射到相同的字元&lt;/strong&gt; ，&lt;br&gt;
但一個字元可以映射到原來的字元(也就是不變)。&lt;/p&gt;
&lt;p&gt;這個題目簡而言之，就是在找尋用特定方式轉換對應字的方法，&lt;br&gt;
比如範例中的paper -&amp;gt; title有以下的轉換對應：&lt;br&gt;
&lt;strong&gt;p &amp;lt;-&amp;gt; t, a &amp;lt;-&amp;gt; i, e &amp;lt;-&amp;gt; l, r &amp;lt;-&amp;gt; e&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由於同構並沒有限制轉換方向，所以既要轉得過去，也要轉得回來，&lt;br&gt;
這代表了他們對應必須要1對1才行。&lt;br&gt;
因此，我們可以想到以下的方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先檢查兩邊長度，不相等則直接回傳False (怎麼轉都沒用XD)&lt;/li&gt;
&lt;li&gt;可以選擇建立一個&lt;strong&gt;HashMap/Dict&lt;/strong&gt; 並&lt;strong&gt;額外處理雙向&lt;/strong&gt; 的對應檢查，&lt;br&gt;
或者選擇開出&lt;strong&gt;2個陣列/Dict(也可用串列，不過要自己轉換)&lt;/strong&gt; 來做檢查。&lt;/li&gt;
&lt;li&gt;每次從s, t中&lt;strong&gt;各取出一個字元&lt;/strong&gt; (假設現在在&lt;strong&gt;index i&lt;/strong&gt; )：&lt;br&gt;
3-1. 兩字元&lt;strong&gt;都未進入&lt;/strong&gt; 陣列對應 -&amp;gt; 將&lt;strong&gt;s[i]&lt;/strong&gt; 與&lt;strong&gt;t[i]&lt;/strong&gt; 放入兩個陣列的對應&lt;br&gt;
3-2. 兩字元&lt;strong&gt;都進入&lt;/strong&gt; 陣列對應 -&amp;gt; 檢查&lt;strong&gt;s[i]&lt;/strong&gt; 是否對到&lt;strong&gt;t[i]&lt;/strong&gt; ，&lt;strong&gt;t[i]&lt;/strong&gt; 是否對到&lt;strong&gt;s[i]&lt;/strong&gt;&lt;br&gt;
(只要&lt;strong&gt;其中一個對錯或沒對到，即可判定為False&lt;/strong&gt; )&lt;/li&gt;
&lt;li&gt;當所有字元均檢查完，表示順利全數對應到，回傳&lt;strong&gt;True&lt;/strong&gt; 。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;簡單吧！&lt;br&gt;
在Java的部份，&lt;br&gt;
我們可以直接利用char可以自動轉換成int當作陣列的index。&lt;br&gt;
沒有對應則會拿到預設值(0)，依此寫成以下程式碼：&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/dbac3522b2153c0ab274cb73219cd3fa.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部份，方便起見我們使用了dict來紀錄，&lt;br&gt;
預設值使用get放入0。&lt;/p&gt;
&lt;p&gt;另外提供一個特別的用法，可以使用&lt;strong&gt;maketrans&lt;/strong&gt; 及&lt;strong&gt;translate&lt;/strong&gt; ，&lt;br&gt;
來進行兩個表的轉換。但由於中間可能有重複，&lt;br&gt;
所以要先經過&lt;strong&gt;set(刪去重複)和list, join&lt;/strong&gt; 以後，&lt;br&gt;
重新&lt;strong&gt;依照原先的字母排列排序(用key＝s.index)&lt;/strong&gt; ，&lt;br&gt;
最終看看s經過轉換以後是否和t相同。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/679b5d53b4a16e6d36a878cdf5730a97.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;
亦可視為O(1)，因限縮在ASCII Code的話也才128種類)&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;限額早鳥連結：&lt;/strong&gt; &lt;a class="link" href="https://hiskio.com/courses/319?promo_code=13L5QJE" target="_blank" rel="noopener"
&gt;&lt;strong&gt;https://hiskio.com/courses/319?promo_code=13L5QJE&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;問卷抽書＆取得上架通知：&lt;/strong&gt; &lt;a class="link" href="https://pse.is/MS2J2?fbclid=IwAR2PMTGbMG-8qh2eq-kfGoolRWWYMPcEXdOa1Bib_pFFUaPlTlGb3UYAeDw" target="_blank" rel="noopener"
&gt;&lt;strong&gt;https://pse.is/MS2J2&lt;/strong&gt; &lt;/a&gt;&lt;br&gt;
如果你對線上課程不放心，&lt;br&gt;
也可以先來&lt;strong&gt;12/17(二)&lt;/strong&gt; 我在天瓏分享的講座看看！&lt;br&gt;
&lt;strong&gt;講座連結：&lt;/strong&gt; &lt;a class="link" href="https://pse.is/JS3LJ?fbclid=IwAR2j615ajqdqNsNHWTST4JnlCdbQzQecNaZG9LV7J55VFnw8ufLWojrk7iw" target="_blank" rel="noopener"
&gt;&lt;strong&gt;https://pse.is/JS3LJ&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 49 Hash Table (3)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-49-hash-table-3/</link><pubDate>Fri, 13 Sep 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-49-hash-table-3/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 49 Hash Table (3)" /&gt;&lt;p&gt;&lt;strong&gt;0217. Contains Duplicate (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 of integers, find if the array contains any duplicates.&lt;/p&gt;
&lt;p&gt;Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct.&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: [1,2,3,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="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,2,3,4]
&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: [1,1,1,3,3,4,3,2,4,2]
&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="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個整數陣列，若陣列有任何重複的數，則回傳true，否則回傳false。&lt;/p&gt;
&lt;p&gt;今天來點簡單的，畢竟中秋節嘛XD&lt;br&gt;
和之前找出單一元素的題目不同，因為這題&lt;strong&gt;沒有限定重複出現的次數&lt;/strong&gt; ，&lt;br&gt;
所以並&lt;strong&gt;不適用於bitwise operation&lt;/strong&gt; 的方法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;以暴力法來說要O(N²)，排序後再比要O(NlogN)&lt;/strong&gt; ，&lt;br&gt;
均不理想，所以一般常見的想法是，&lt;br&gt;
一樣引入&lt;strong&gt;hashmap或dictionary&lt;/strong&gt; 來解題。&lt;/p&gt;
&lt;p&gt;而由於我們&lt;strong&gt;只在意數字有沒有出現&lt;/strong&gt; ，對於Java來說，&lt;br&gt;
還有另外一個名為&lt;strong&gt;HashSet&lt;/strong&gt; 的方式可以使用。&lt;br&gt;
HashSet在&lt;strong&gt;新增&lt;/strong&gt; 方面複雜度同於HashMap均為&lt;strong&gt;O(1)&lt;/strong&gt; ，&lt;br&gt;
但HashSet同時具備Set的特性，&lt;strong&gt;同個資料只能出現在Set當中一次&lt;/strong&gt; ，&lt;br&gt;
&lt;strong&gt;若有相同資料要被新增時，則新增會失敗(回傳false)&lt;/strong&gt; ；&lt;br&gt;
我們可以利用這點，每次對HashSet新增當前的數字，&lt;br&gt;
失敗則代表已經出現重複了(直接回傳true)，&lt;br&gt;
若全數新增完畢則代表不存在重複(回傳false)。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/9791e4834086d6a3371a0a63bc5ce763.js"&gt;&lt;/script&gt;
&lt;p&gt;&lt;strong&gt;Python的set新增時碰到重複的資料時不會進行任何動作&lt;/strong&gt; ，&lt;br&gt;
所以這邊還是使用dictionary。&lt;br&gt;
另一種作法是可以使用set來進行化簡後，&lt;strong&gt;直接檢查總長度是否改變&lt;/strong&gt; ，&lt;br&gt;
即可知道是不是含有重複的元素。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/6c83c12c7d02d3eb6390f8765db211a4.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N), O(N)，因為每次插入均為O(1))&lt;/p&gt;
&lt;p&gt;「如果限制不用HashSet/Dictionary，但給你nums值的範圍呢？」&lt;br&gt;
(建立一個array/list，總長為整個範圍，&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學演算法 - 41 Hash Table (2)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-41-hash-table-2/</link><pubDate>Wed, 28 Aug 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-41-hash-table-2/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 41 Hash Table (2)" /&gt;&lt;p&gt;&lt;strong&gt;0242. Valid Anagram (Easy)&lt;/strong&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: s = &amp;#34;anagram&amp;#34;, t = &amp;#34;nagaram&amp;#34;
&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;/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: s = &amp;#34;rat&amp;#34;, t = &amp;#34;car&amp;#34;
&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;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
You may assume the string contains only lowercase alphabets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Follow up:&lt;/strong&gt;&lt;br&gt;
What if the inputs contain unicode characters? How would you adapt your solution to such case?&lt;/p&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定兩個字串s跟t，&lt;br&gt;
寫出一個函式來判斷t是否是a的一個anagram(易位構詞)。&lt;/p&gt;
&lt;p&gt;所謂的anagram就是指將這個字串的字母搬動順序以後，&lt;br&gt;
可以組成另一個字串的遊戲，這在很多推理小說裡都有出現過，&lt;br&gt;
比如達文西密碼或者哈利波特XD&lt;/p&gt;
&lt;p&gt;那麼，怎麼確切知道s跟t是否是彼此的anagram呢？&lt;br&gt;
我們比較幸運只需要檢查正確與否就好，所以一般常見的解法有幾個：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;排序(暴力?)法&lt;/strong&gt;&lt;br&gt;
既然完全是由相同的字母及相同使用字母的個數組成，&lt;br&gt;
那就代表只要將兩個字串進行排序，最後它們會&lt;strong&gt;長得一模一樣&lt;/strong&gt; 。&lt;br&gt;
但這樣作的時間複雜度為&lt;strong&gt;O(n log n)(n為字串長)&lt;/strong&gt; 。&lt;br&gt;
雖然能夠通過測試，但似乎不是很理想。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hash Table&lt;/strong&gt; 法&lt;br&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-39-array-8-hash-table-1-89fa9bd2832d?source=friends_link&amp;amp;sk=917a595b0687f84474a6bd93bb3e414b" target="_blank" rel="noopener"
&gt;Hash Table&lt;/a&gt;的概念，那麼這次我們應該也可以使用相同的方式來處理。由於題目已經告知字串僅含小寫字母，也就是a-z，&lt;br&gt;
只要依序掃瞄過兩個字串，將字串所含每個字母的個數計算是否相等，&lt;br&gt;
即可判定結果。&lt;br&gt;
這麼作只需要&lt;strong&gt;O(n)&lt;/strong&gt; 的時間複雜度，空間部分只需要&lt;strong&gt;O(1)&lt;/strong&gt; 。&lt;br&gt;
(因為是&lt;strong&gt;26個字母&lt;/strong&gt; ，所以陣列長是固定的)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我們可以利用上一次提到的ASCII的方式，&lt;br&gt;
來對&lt;strong&gt;a-z&lt;/strong&gt; 的部分位移到一個計數陣列的&lt;strong&gt;0到25&lt;/strong&gt; ，&lt;br&gt;
同時，掃過&lt;strong&gt;s&lt;/strong&gt; 的時候將對應的&lt;strong&gt;字母計數遞增&lt;/strong&gt; ，&lt;br&gt;
掃過&lt;strong&gt;t&lt;/strong&gt; 時將對應的&lt;strong&gt;字母計數遞減&lt;/strong&gt; ；&lt;br&gt;
一旦有字母是遞減到&lt;strong&gt;小於零&lt;/strong&gt; 的話就可以直接判定s和t彼此並非anagram。&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/37bdbfd09c7386aefa5407be26ec6e90.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部分這邊也可以另外使用別的方法，&lt;br&gt;
這邊提供幾個比較簡便且複雜度一樣的方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;使用&lt;strong&gt;count&lt;/strong&gt; 跟&lt;strong&gt;all&lt;/strong&gt; 來計算(所以對每個字母都會分別檢查一次)&lt;br&gt;
(all是用來判定所有會迭代的狀況是否全數為TRUE)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用&lt;strong&gt;Counter&lt;/strong&gt; 計算後再比較(所以會先算完全部再來檢查)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/d13d9a3d347ddfaa917f029aa4651c85.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;
(使用類似Java的方式，但每個字元要先確認是否是大寫，&lt;br&gt;
若是，先將其轉為小寫才往陣列中存放，之後的做法應該是一致的。)&lt;br&gt;
(ASCII中A-Z是65&lt;del&gt;90而a-z是97&lt;/del&gt;122，可以先平移對應的相差量)&lt;/p&gt;
&lt;p&gt;「如果還有其他英文字母以外的字元？」&lt;br&gt;
(將陣列改成用HashMap，&lt;br&gt;
key存放字元，value存放出現次數。Python則用Dict即可)&lt;/p&gt;
&lt;p&gt;「如果大小寫視為相同，空格及標點符號要省略呢？&lt;br&gt;
(沒錯，就跟達文西密碼的留法一樣，沒人在管標點的XD)」&lt;br&gt;
(可以嘗試刪去不需要的，或只取英文字母的部分。)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;1.&lt;a class="link" href="https://leetcode.com/problems/group-anagrams/" target="_blank" rel="noopener"
&gt;&lt;strong&gt;0049. Group Anagrams&lt;/strong&gt; &lt;/a&gt;2.&lt;a class="link" href="https://leetcode.com/problems/find-all-anagrams-in-a-string/" target="_blank" rel="noopener"
&gt;&lt;strong&gt;0438. Find All Anagrams in a String&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學演算法 - 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></channel></rss>