<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Hannah Weng</title>
  
  <subtitle>Cloud &amp; AI Solution Architect</subtitle>
  <link href="https://hannahweng.xyz/atom.xml" rel="self"/>
  
  <link href="https://hannahweng.xyz/"/>
  <updated>2024-08-03T00:00:00.000Z</updated>
  <id>https://hannahweng.xyz/</id>
  
  <author>
    <name>Hannah Weng</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>How to Change the Owner of Power Apps Apps</title>
    <link href="https://hannahweng.xyz/2024/08/03/PowerAppsOwnerChange/"/>
    <id>https://hannahweng.xyz/2024/08/03/PowerAppsOwnerChange/</id>
    <published>2024-08-03T00:00:00.000Z</published>
    <updated>2024-08-03T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Gathering-Information-Needed-To-Change-The-Power-Apps-App-Owner"><a href="#Gathering-Information-Needed-To-Change-The-Power-Apps-App-Owner" class="headerlink" title="Gathering Information Needed To Change The Power Apps App Owner"></a><strong>Gathering Information Needed To Change The Power Apps App Owner</strong></h1><p>To change the owner of a Power Apps app we will need to gather 3 pieces of information:</p><ul><li>Environment ID from the Power Apps maker portal</li><li>App ID from the Power Apps maker portal</li><li>User Account Object ID from Azure Active Directory</li></ul><h2 id="Obtain-The-Environment-ID"><a href="#Obtain-The-Environment-ID" class="headerlink" title="Obtain The Environment ID"></a><strong>Obtain The Environment ID</strong></h2><p>Open <a href="https://make.powerapps.com/">make.powerapps.com</a> and open the settings menu. Choose <em>developer resources</em>.</p><img src="/2024/08/03/PowerAppsOwnerChange/PowerAppsSetting.png" class="" title="test"><p>The Environment ID will appear in the developer resources menu： </p><p>6955xxxx-fxxx-4xxx-axxx-2bxxxxxxxxxx</p><img src="/2024/08/03/PowerAppsOwnerChange/envid.png" class="" title="envid"><h2 id="Get-The-Power-Apps-App-ID"><a href="#Get-The-Power-Apps-App-ID" class="headerlink" title="Get The Power Apps App ID"></a><strong>Get The Power Apps App ID</strong></h2><p>Go to the Apps menu in the maker portal, select the three dots beside the app then click Details.</p><img src="/2024/08/03/PowerAppsOwnerChange/appid.png" class="" title="appid"><p>The App ID will appear in the Details menu： </p><p>edxxxxxx-5xxx-4xxx-axxx-66xxxxxxxxxx</p><img src="/2024/08/03/PowerAppsOwnerChange/appiddetails.png" class="" title="appiddetails"><p>Currently, you can see the Owner of the App is Hexuan Weng.</p><img src="/2024/08/03/PowerAppsOwnerChange/currentowner.png" class="" title="current owner"><h2 id="Find-The-New-Owner’s-User-Account-Object-ID"><a href="#Find-The-New-Owner’s-User-Account-Object-ID" class="headerlink" title="Find The New Owner’s User Account Object ID"></a><strong>Find The New Owner’s User Account Object ID</strong></h2><p>Login to <a href="https://portal.azure.com/">portal.azure.com</a> and search for the user account you want to transfer ownership to. In this case we will make a user called <em>Power Platform Service Account</em> the Owner.</p><img src="/2024/08/03/PowerAppsOwnerChange/accountobjectid.png" class=""><p>The Object ID will appear in the user’s profile.</p><p>dexxxxxx-fxxx-4xxx-8xxx-f1xxxxxxxxxx</p><img src="/2024/08/03/PowerAppsOwnerChange/objectid.png" class=""><h1 id="Method-1-Change-Power-Apps-App-Owner-With-A-Flow"><a href="#Method-1-Change-Power-Apps-App-Owner-With-A-Flow" class="headerlink" title="Method 1: Change Power Apps App Owner With A Flow"></a><strong>Method 1: Change Power Apps App Owner With A Flow</strong></h1><p>The first way we can change the owner of a Power Apps app is by building a flow to transfer ownership. Create a new Power Automate flow with an instant trigger. Name the flow <em>Change App Owner</em>, select <em>Manually trigger a flow</em> then click <em>Create</em>.</p><img src="/2024/08/03/PowerAppsOwnerChange/changepowerappflow.png" class=""><p>Add the flow action <em>Power Apps For Admins – Set App Owner</em> with the following parameters and fill in the environment name, Power App Name and New PowerApp Owner with the unique identifiers we gathered earlier.</p><img src="/2024/08/03/PowerAppsOwnerChange/powerappsforadmin.png" class=""><p>In this step:</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$EnvironmentName = Environment ID</span><br><span class="line">$AppName = App ID</span><br><span class="line">$NewAppOwner = Object ID</span><br></pre></td></tr></table></figure><img src="/2024/08/03/PowerAppsOwnerChange/setappowner.png" class=""><p>Run the flow.</p><img src="/2024/08/03/PowerAppsOwnerChange/runflow.png" class=""><p>The Power Platform Service Account now owns the app.</p><img src="/2024/08/03/PowerAppsOwnerChange/ownerupdated.png" class=""><h1 id="Method-2-Change-Power-Apps-App-Owner-With-PowerShell"><a href="#Method-2-Change-Power-Apps-App-Owner-With-PowerShell" class="headerlink" title="Method 2: Change Power Apps App Owner With PowerShell"></a><strong>Method 2: Change Power Apps App Owner With PowerShell</strong></h1><p>If you like to use PowerShell for automating administrative tasks there is a <a href="https://docs.microsoft.com/en-us/power-platform/admin/powerapps-powershell">robust library of Power Apps cmdlets</a> including a <a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powerapps.administration.powershell/set-adminpowerappowner?view=pa-ps-latest">cmdlet to set the Power App owner</a>. Open the Windows PowerShell ISE and <em>Run as administrator</em>.</p><img src="/2024/08/03/PowerAppsOwnerChange/powershell.png" class=""><p>Create a new script called <em>ChangeAppOwner.ps1</em></p><img src="/2024/08/03/PowerAppsOwnerChange/powershellISE.png" class=""><p>Paste the following code into the text editor. Switch the environment name, app name and new app owner with your own information then press the green play button to execute the script.</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$EnvironmentName</span> = <span class="string">&#x27;6955xxxx-fxxx-4xxx-axxx-2bxxxxxxxxxx&#x27;</span></span><br><span class="line"><span class="variable">$AppName</span> = <span class="string">&#x27;edxxxxxx-5xxx-4xxx-axxx-66xxxxxxxxxx&#x27;</span></span><br><span class="line"><span class="variable">$NewAppOwner</span> = <span class="string">&#x27;dexxxxxx-fxxx-4xxx-8xxx-f1xxxxxxxxxx&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">Set-AdminPowerAppOwner</span> –AppName <span class="variable">$AppName</span> <span class="literal">-AppOwner</span> <span class="variable">$NewAppOwner</span> –EnvironmentName <span class="variable">$EnvironmentName</span></span><br></pre></td></tr></table></figure><img src="/2024/08/03/PowerAppsOwnerChange/powershellcommand.png" class=""><p><strong>Possible Error</strong></p><img src="/2024/08/03/PowerAppsOwnerChange/adminpermission.png" class=""><p>There are a couple of possibilites</p><ol><li>You need to be a Global Admin or AAD Admin in the tenant to run the “Admin” commands. Are you a global admin?</li><li>Are you supplying the GUIDS for the Appname, Environment, and AppOwner? The examples all show guids, rather than just names.</li></ol><h1 id="Method-3-Change-Power-Apps-App-Owner-Using-The-Center-Of-Excellence-Starter-Kit"><a href="#Method-3-Change-Power-Apps-App-Owner-Using-The-Center-Of-Excellence-Starter-Kit" class="headerlink" title="Method 3: Change Power Apps App Owner Using The Center Of Excellence Starter Kit"></a><strong>Method 3: Change Power Apps App Owner Using The Center Of Excellence Starter Kit</strong></h1><p>The <a href="https://docs.microsoft.com/en-us/power-platform/guidance/coe/starter-kit">Power Apps Center Of Excellence Starter Kit</a> offers the easiest way to change a Power Apps App owner. Open the canvas app called <em>Admin – App Permission Center</em> that is included in the CoE Starter Kit. Browse to the app’s environment, select the app from the list and then click <em>Add Permissions</em>.</p><p>[^1]: <a href="https://docs.microsoft.com/en-us/power-platform/admin/powerapps-powershell">Power Apps cmdlets</a></p><p>[^2]: <a href="https://docs.microsoft.com/en-us/power-platform/guidance/coe/starter-kit">Power Apps Center Of Excellence Starter Kit</a></p>]]></content>
    
    
    <summary type="html">This post will guide you through three methods for changing the owner of a Power Apps app. You’ll need to gather the following information: Environment ID from the Power Apps maker portal, App ID from the Power Apps maker portal, User Account Object ID from Azure Active Directory.</summary>
    
    
    
    <category term="Microsoft Power Platform" scheme="https://hannahweng.xyz/categories/Microsoft-Power-Platform/"/>
    
    
    <category term="Power Apps" scheme="https://hannahweng.xyz/tags/Power-Apps/"/>
    
  </entry>
  
  <entry>
    <title>LC998 - Maximum Binary Tree II</title>
    <link href="https://hannahweng.xyz/2022/08/30/LC998MaximumBinaryTreeII/"/>
    <id>https://hannahweng.xyz/2022/08/30/LC998MaximumBinaryTreeII/</id>
    <published>2022-08-30T12:00:07.000Z</published>
    <updated>2022-08-30T12:00:07.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>A maximum tree is a tree where every node has a value greater than any other value in its subtree.<br>You are given the root of a maximum binary tree and an integer val.<br>Just as in the previous problem, the given tree was constructed from a list a (root &#x3D; Construct(a)) recursively with the following Construct(a) routine:<br>If a is empty, return null.<br>Otherwise, let a[i] be the largest element of a. Create a root node with the value a[i].<br>The left child of root will be Construct([a[0], a[1], …, a[i - 1]]).<br>The right child of root will be Construct([a[i + 1], a[i + 2], …, a[a.length - 1]]).<br>Return root.<br>Note that we were not given a directly, only a root node root &#x3D; Construct(a).<br>Suppose b is a copy of a with the value val appended to it. It is guaranteed that b has unique values.<br>Return Construct(b).</p><p>Example 1:</p><img src="/2022/08/30/LC998MaximumBinaryTreeII/e1.jpg" class="" title="e1"><pre><code>Input: root = [4,1,3,null,null,2], val = 5Output: [5,4,null,1,3,null,null,2]Explanation: a = [1,4,2,3], b = [1,4,2,3,5]<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Example 2:</span><br><span class="line">&#123;% asset_img e2.jpg e2%&#125;</span><br></pre></td></tr></table></figure>Input: root = [5,2,4,null,1], val = 3Output: [5,2,4,null,1,null,3]Explanation: a = [2,1,5,4], b = [2,1,5,4,3]<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Example 3:</span><br><span class="line">&#123;% asset_img e3.jpg e3%&#125;</span><br></pre></td></tr></table></figure>Input: root = [5,2,3,null,1], val = 4Output: [5,2,4,null,1,3]Explanation: a = [2,1,5,3], b = [2,1,5,3,4]<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">Constraints:</span><br></pre></td></tr></table></figure>The number of nodes in the tree is in the range [1, 100].1 &lt;= Node.val &lt;= 100All the values of the tree are unique.1 &lt;= val &lt;= 100<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">## Solution</span><br><span class="line">Because the new val is added at the end of the array, we can compare with the root node,</span><br><span class="line">- If it is larger than the root, then val is the new root and the original root is its left subtree (since val is to the right of the original root&#x27;s value in the array).</span><br><span class="line">- If it is smaller than the root node, it means that val must be recursively added to the right node of the original root. Note that recursion may change the root of the right subtree, so reassign the right node of the root node.</span><br><span class="line">Finally, if the recursive root is empty, a new leaf node can be returned directly.</span><br><span class="line"></span><br><span class="line">```python</span><br><span class="line"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line">#     def __init__(self, val=0, left=None, right=None):</span><br><span class="line">#         self.val = val</span><br><span class="line">#         self.left = left</span><br><span class="line">#         self.right = right</span><br><span class="line">class Solution:</span><br><span class="line">    def insertIntoMaxTree(self, root: Optional[TreeNode], val: int) -&gt; Optional[TreeNode]:</span><br><span class="line">        if not root:</span><br><span class="line">            return TreeNode(val)</span><br><span class="line">        </span><br><span class="line">        if val &gt; root.val:</span><br><span class="line">            cur = TreeNode(val)</span><br><span class="line">            cur.left = root</span><br><span class="line">            return cur</span><br><span class="line">        </span><br><span class="line">        root.right = self.insertIntoMaxTree(root.right, val)</span><br><span class="line">        return root</span><br></pre></td></tr></table></figure>[^1]: [998. Maximum Binary Tree II](https://leetcode.com/problems/maximum-binary-tree-ii/)</code></pre>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 91. Leetcode: 288/2752</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="medium" scheme="https://hannahweng.xyz/tags/medium/"/>
    
    <category term="Recursion" scheme="https://hannahweng.xyz/tags/Recursion/"/>
    
  </entry>
  
  <entry>
    <title>LC654 - Maximum Binary Tree</title>
    <link href="https://hannahweng.xyz/2022/08/30/LC654MaximumBinaryTree/"/>
    <id>https://hannahweng.xyz/2022/08/30/LC654MaximumBinaryTree/</id>
    <published>2022-08-30T11:39:34.000Z</published>
    <updated>2022-08-30T11:39:34.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>You are given an integer array nums with no duplicates. A maximum binary tree can be built recursively from nums using the following algorithm:</p><ol><li>Create a root node whose value is the maximum value in nums.</li><li>Recursively build the left subtree on the subarray prefix to the left of the maximum value.</li><li>Recursively build the right subtree on the subarray suffix to the right of the maximum value.<br>Return the maximum binary tree built from nums.</li></ol><p>Example 1:</p><img src="/2022/08/30/LC654MaximumBinaryTree/e1.jpg" class="" title="e1"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">Input: nums = [3,2,1,6,0,5]</span><br><span class="line">Output: [6,3,5,null,2,0,null,null,1]</span><br><span class="line">Explanation: The recursive calls are as follow:</span><br><span class="line">- The largest value in [3,2,1,6,0,5] is 6. Left prefix is [3,2,1] and right suffix is [0,5].</span><br><span class="line">    - The largest value in [3,2,1] is 3. Left prefix is [] and right suffix is [2,1].</span><br><span class="line">        - Empty array, so no child.</span><br><span class="line">        - The largest value in [2,1] is 2. Left prefix is [] and right suffix is [1].</span><br><span class="line">            - Empty array, so no child.</span><br><span class="line">            - Only one element, so child is a node with value 1.</span><br><span class="line">    - The largest value in [0,5] is 5. Left prefix is [0] and right suffix is [].</span><br><span class="line">        - Only one element, so child is a node with value 0.</span><br><span class="line">        - Empty array, so no child.</span><br></pre></td></tr></table></figure><p>Example 2:</p><img src="/2022/08/30/LC654MaximumBinaryTree/e2.jpg" class="" title="e2"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: nums = [3,2,1]</span><br><span class="line">Output: [3,null,2,null,1]</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">1 &lt;= nums.length &lt;= 1000</span><br><span class="line">0 &lt;= nums[i] &lt;= 1000</span><br><span class="line">All integers in nums are unique.</span><br></pre></td></tr></table></figure><h2 id="Solution"><a href="#Solution" class="headerlink" title="Solution"></a>Solution</h2><img src="/2022/08/30/LC654MaximumBinaryTree/s1.png" class="" title="s1"><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"># class TreeNode:</span></span><br><span class="line"><span class="comment">#     def __init__(self, val=0, left=None, right=None):</span></span><br><span class="line"><span class="comment">#         self.val = val</span></span><br><span class="line"><span class="comment">#         self.left = left</span></span><br><span class="line"><span class="comment">#         self.right = right</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">constructMaximumBinaryTree</span>(<span class="params">self, nums: <span class="type">List</span>[<span class="built_in">int</span>]</span>) -&gt; <span class="type">Optional</span>[TreeNode]:</span><br><span class="line">        <span class="keyword">def</span> <span class="title function_">dfs</span>(<span class="params">arr</span>):</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> arr:</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">None</span> </span><br><span class="line">            </span><br><span class="line">            root = <span class="built_in">max</span>(arr)</span><br><span class="line">            idx = arr.index(root)</span><br><span class="line">            <span class="keyword">return</span> TreeNode(root, dfs(arr[:idx]), dfs(arr[idx+<span class="number">1</span>:]))</span><br><span class="line">        <span class="keyword">return</span> dfs(nums)</span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/maximum-binary-tree/">654. Maximum Binary Tree</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 91. Leetcode: 287/2752</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="medium" scheme="https://hannahweng.xyz/tags/medium/"/>
    
    <category term="Recursion" scheme="https://hannahweng.xyz/tags/Recursion/"/>
    
  </entry>
  
  <entry>
    <title>LC318 - Maaximum Product of Word Lengths</title>
    <link href="https://hannahweng.xyz/2022/08/29/LC318MaaximumProductofWordLengths/"/>
    <id>https://hannahweng.xyz/2022/08/29/LC318MaaximumProductofWordLengths/</id>
    <published>2022-08-29T06:34:19.000Z</published>
    <updated>2022-08-29T06:34:19.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>Given a string array words, return the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. If no such two words exist, return 0.</p><p>Example 1:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: words = [&quot;abcw&quot;,&quot;baz&quot;,&quot;foo&quot;,&quot;bar&quot;,&quot;xtfn&quot;,&quot;abcdef&quot;]</span><br><span class="line">Output: 16</span><br><span class="line">Explanation: The two words can be &quot;abcw&quot;, &quot;xtfn&quot;.</span><br></pre></td></tr></table></figure><p>Example 2:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: words = [&quot;a&quot;,&quot;ab&quot;,&quot;abc&quot;,&quot;d&quot;,&quot;cd&quot;,&quot;bcd&quot;,&quot;abcd&quot;]</span><br><span class="line">Output: 4</span><br><span class="line">Explanation: The two words can be &quot;ab&quot;, &quot;cd&quot;.</span><br></pre></td></tr></table></figure><p>Example 3:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: words = [&quot;a&quot;,&quot;aa&quot;,&quot;aaa&quot;,&quot;aaaa&quot;]</span><br><span class="line">Output: 0</span><br><span class="line">Explanation: No such pair of words.</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">2 &lt;= words.length &lt;= 1000</span><br><span class="line">1 &lt;= words[i].length &lt;= 1000</span><br><span class="line">words[i] consists only of lowercase English letters.</span><br></pre></td></tr></table></figure><h2 id="Solution"><a href="#Solution" class="headerlink" title="Solution"></a>Solution</h2><ol><li>create a list called s to store all the individual letter of each word </li><li>using two for loops to compare each two words in the list, if there is no common letter, update the answer</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># O(n^2) time | O(n) space</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">maxProduct</span>(<span class="params">self, words: <span class="type">List</span>[<span class="built_in">str</span>]</span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">        ans = <span class="number">0</span></span><br><span class="line">        d = []</span><br><span class="line">        <span class="keyword">for</span> word <span class="keyword">in</span> words:</span><br><span class="line">            d.append(<span class="built_in">set</span>(<span class="built_in">list</span>(word)))</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(words)):</span><br><span class="line">            <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(i+<span class="number">1</span>, <span class="built_in">len</span>(words)):</span><br><span class="line">                <span class="keyword">if</span> <span class="keyword">not</span> d[i] &amp; d[j]:</span><br><span class="line">                    ans = <span class="built_in">max</span>(ans, <span class="built_in">len</span>(words[i])*<span class="built_in">len</span>(words[j]))</span><br><span class="line">        <span class="keyword">return</span> ans</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/maximum-product-of-word-lengths/">318. Maximum Product of Word Lengths</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 90. Leetcode: 286/2752</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="Brute Force" scheme="https://hannahweng.xyz/tags/Brute-Force/"/>
    
    <category term="medium" scheme="https://hannahweng.xyz/tags/medium/"/>
    
  </entry>
  
  <entry>
    <title>LC1470 - Shuffle the Array</title>
    <link href="https://hannahweng.xyz/2022/08/29/LC1470Shuffle/"/>
    <id>https://hannahweng.xyz/2022/08/29/LC1470Shuffle/</id>
    <published>2022-08-29T05:49:53.000Z</published>
    <updated>2022-08-29T05:49:53.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>Given the array nums consisting of 2n elements in the form [x1,x2,…,xn,y1,y2,…,yn].<br>Return the array in the form [x1,y1,x2,y2,…,xn,yn].</p><p>Example 1:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: nums = [2,5,1,3,4,7], n = 3</span><br><span class="line">Output: [2,3,5,4,1,7] </span><br><span class="line">Explanation: Since x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 then the answer is [2,3,5,4,1,7].</span><br></pre></td></tr></table></figure><p>Example 2:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: nums = [1,2,3,4,4,3,2,1], n = 4</span><br><span class="line">Output: [1,4,2,3,3,2,4,1]</span><br></pre></td></tr></table></figure><p>Example 3:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: nums = [1,1,2,2], n = 2</span><br><span class="line">Output: [1,2,1,2]</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">1 &lt;= n &lt;= 500</span><br><span class="line">nums.length == 2n</span><br><span class="line">1 &lt;= nums[i] &lt;= 10^3</span><br></pre></td></tr></table></figure><h2 id="Solution"><a href="#Solution" class="headerlink" title="Solution"></a>Solution</h2><ol><li>slow index: i, faster index: j<ul><li>initial i &#x3D; 0, j &#x3D; n</li></ul></li><li>when j reaches to the end, i reaches the end of the first half of this array</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># O(n) time | O(n) space</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">shuffle</span>(<span class="params">self, nums: <span class="type">List</span>[<span class="built_in">int</span>], n: <span class="built_in">int</span></span>) -&gt; <span class="type">List</span>[<span class="built_in">int</span>]:</span><br><span class="line">        i, j = <span class="number">0</span>, n</span><br><span class="line">        ans = []</span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(n, <span class="built_in">len</span>(nums)):</span><br><span class="line">            ans.append(nums[i])</span><br><span class="line">            ans.append(nums[j])</span><br><span class="line">            i += <span class="number">1</span></span><br><span class="line">        <span class="keyword">return</span> ans</span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/shuffle-the-array/">1470. Shuffle the Array</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 90. Leetcode: 286/2752</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="easy" scheme="https://hannahweng.xyz/tags/easy/"/>
    
    <category term="Two Pointers" scheme="https://hannahweng.xyz/tags/Two-Pointers/"/>
    
  </entry>
  
  <entry>
    <title>LC662 - Maximum Width of Binary Tree</title>
    <link href="https://hannahweng.xyz/2022/08/27/LC662MaximumWidthofBinaryTree/"/>
    <id>https://hannahweng.xyz/2022/08/27/LC662MaximumWidthofBinaryTree/</id>
    <published>2022-08-27T23:30:35.000Z</published>
    <updated>2022-08-27T23:30:35.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>Given the root of a binary tree, return the maximum width of the given tree.</p><p>The maximum width of a tree is the maximum width among all levels.</p><p>The width of one level is defined as the length between the end-nodes (the leftmost and rightmost non-null nodes), where the null nodes between the end-nodes that would be present in a complete binary tree extending down to that level are also counted into the length calculation.</p><p>It is guaranteed that the answer will in the range of a 32-bit signed integer.</p><p>Example 1:</p><img src="/2022/08/27/LC662MaximumWidthofBinaryTree/e1.jpg" class="" title="e1"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: root = [1,3,2,5,3,null,9]</span><br><span class="line">Output: 4</span><br><span class="line">Explanation: The maximum width exists in the third level with length 4 (5,3,null,9).</span><br></pre></td></tr></table></figure><p>Example 2:</p><img src="/2022/08/27/LC662MaximumWidthofBinaryTree/e2.jpg" class="" title="e2"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: root = [1,3,2,5,null,null,9,6,null,7]</span><br><span class="line">Output: 7</span><br><span class="line">Explanation: The maximum width exists in the fourth level with length 7 (6,null,null,null,null,null,7).</span><br></pre></td></tr></table></figure><p>Example 3:</p><img src="/2022/08/27/LC662MaximumWidthofBinaryTree/e3.jpg" class="" title="e3"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: root = [1,3,2,5]</span><br><span class="line">Output: 2</span><br><span class="line">Explanation: The maximum width exists in the second level with length 2 (3,2).</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">The number of nodes in the tree is in the range [1, 3000].</span><br><span class="line">-100 &lt;= Node.val &lt;= 100</span><br></pre></td></tr></table></figure><h2 id="Soution"><a href="#Soution" class="headerlink" title="Soution"></a>Soution</h2><p>Using the full binary tree number, the distance between any two nodes in the same layer (with empty nodes) can be easily calculated, and our BFS returns the layer with the largest distance between the leftmost and the rightmost.</p><img src="/2022/08/27/LC662MaximumWidthofBinaryTree/solution.png" class="" title="solution"><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"># class TreeNode:</span></span><br><span class="line"><span class="comment">#     def __init__(self, val=0, left=None, right=None):</span></span><br><span class="line"><span class="comment">#         self.val = val</span></span><br><span class="line"><span class="comment">#         self.left = left</span></span><br><span class="line"><span class="comment">#         self.right = right</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">widthOfBinaryTree</span>(<span class="params">self, root: <span class="type">Optional</span>[TreeNode]</span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">        ans = <span class="number">0</span></span><br><span class="line">        queue = deque([(<span class="number">1</span>, root)])</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span> queue:</span><br><span class="line">            l, r = <span class="built_in">float</span>(<span class="string">&#x27;inf&#x27;</span>), <span class="number">0</span></span><br><span class="line">            <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(queue)):</span><br><span class="line">                idx, popnode = queue.popleft()</span><br><span class="line">                <span class="keyword">if</span> popnode.left:</span><br><span class="line">                    queue.append((idx*<span class="number">2</span>, popnode.left))</span><br><span class="line">                <span class="keyword">if</span> popnode.right:</span><br><span class="line">                    queue.append((idx*<span class="number">2</span>+<span class="number">1</span>, popnode.right))</span><br><span class="line">                l, r = <span class="built_in">min</span>(idx, l), <span class="built_in">max</span>(idx, r)</span><br><span class="line">            ans = <span class="built_in">max</span>(ans, r-l+<span class="number">1</span>)</span><br><span class="line">        <span class="keyword">return</span> ans</span><br><span class="line"></span><br><span class="line"><span class="comment">#Runtime: 42 ms, faster than 97.03% of Python3 online submissions for Maximum Width of Binary Tree.</span></span><br><span class="line"><span class="comment">#Memory Usage: 14.8 MB, less than 46.14% of Python3 online submissions for Maximum Width of Binary Tree.</span></span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/maximum-width-of-binary-tree/">662. Maximum Width of Binary Tree</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 88. Leetcode: 283/2752</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="medium" scheme="https://hannahweng.xyz/tags/medium/"/>
    
    <category term="Breadth First Search" scheme="https://hannahweng.xyz/tags/Breadth-First-Search/"/>
    
  </entry>
  
  <entry>
    <title>LC1464 - Maximum Product of Two Elements in an Array</title>
    <link href="https://hannahweng.xyz/2022/08/26/LC1464MaximumProductofTwoElementsinanArray/"/>
    <id>https://hannahweng.xyz/2022/08/26/LC1464MaximumProductofTwoElementsinanArray/</id>
    <published>2022-08-26T05:25:18.000Z</published>
    <updated>2022-08-26T05:25:18.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>Given the array of integers nums, you will choose two different indices i and j of that array. Return the maximum value of (nums[i]-1)*(nums[j]-1).</p><p>Example 1:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: nums = [3,4,5,2]</span><br><span class="line">Output: 12 </span><br><span class="line">Explanation: If you choose the indices i=1 and j=2 (indexed from 0), you will get the maximum value, that is, (nums[1]-1)*(nums[2]-1) = (4-1)*(5-1) = 3*4 = 12.</span><br></pre></td></tr></table></figure><p>Example 2:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: nums = [1,5,4,5]</span><br><span class="line">Output: 16</span><br><span class="line">Explanation: Choosing the indices i=1 and j=3 (indexed from 0), you will get the maximum value of (5-1)*(5-1) = 16.</span><br></pre></td></tr></table></figure><p>Example 3:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: nums = [3,7]</span><br><span class="line">Output: 12</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">2 &lt;= nums.length &lt;= 500</span><br><span class="line">1 &lt;= nums[i] &lt;= 10^3</span><br></pre></td></tr></table></figure><h2 id="Solutions"><a href="#Solutions" class="headerlink" title="Solutions"></a>Solutions</h2><h3 id="Sorting"><a href="#Sorting" class="headerlink" title="Sorting"></a>Sorting</h3><ol><li>Sort first</li><li>then the last two values ​​are the largest two values</li><li>find the final answer as required and return</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># O(nlogn) time | O(1) space</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">maxProduct</span>(<span class="params">self, nums: <span class="type">List</span>[<span class="built_in">int</span>]</span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">        nums.sort()</span><br><span class="line">        <span class="keyword">return</span> (nums[-<span class="number">1</span>]-<span class="number">1</span>)*(nums[-<span class="number">2</span>]-<span class="number">1</span>)</span><br></pre></td></tr></table></figure><h3 id="Two-Pointers"><a href="#Two-Pointers" class="headerlink" title="Two Pointers"></a>Two Pointers</h3><p>This problem is actually to find the first and second largest numbers in the array. We only need to use first and second to represent the subscripts of the first and second largest numbers, and then traverse the array and compare them one by one.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># O(n) time | O(1) space</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">maxProduct</span>(<span class="params">self, nums: <span class="type">List</span>[<span class="built_in">int</span>]</span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">        first, second = <span class="number">0</span>, <span class="number">1</span></span><br><span class="line">        <span class="keyword">if</span> nums[second] &gt; nums[first]:</span><br><span class="line">            first, second = <span class="number">1</span>, <span class="number">0</span></span><br><span class="line">        </span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">2</span>, <span class="built_in">len</span>(nums)):</span><br><span class="line">            v = nums[i]</span><br><span class="line">            <span class="keyword">if</span> v &gt; nums[first]:</span><br><span class="line">                first, second = i, first</span><br><span class="line">            <span class="keyword">elif</span> v &gt; nums[second]:</span><br><span class="line">                second = i</span><br><span class="line">        <span class="keyword">return</span> (nums[first]-<span class="number">1</span>)*(nums[second]-<span class="number">1</span>)</span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/maximum-product-of-two-elements-in-an-array/">1464. Maximum Product of Two Elements in an Array</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 87. Leetcode: 282/2752</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="easy" scheme="https://hannahweng.xyz/tags/easy/"/>
    
    <category term="Two Pointers" scheme="https://hannahweng.xyz/tags/Two-Pointers/"/>
    
  </entry>
  
  <entry>
    <title>LC658 - Find K Closest Elements</title>
    <link href="https://hannahweng.xyz/2022/08/25/LC658FindKClosestElements/"/>
    <id>https://hannahweng.xyz/2022/08/25/LC658FindKClosestElements/</id>
    <published>2022-08-25T18:36:23.000Z</published>
    <updated>2022-08-25T18:36:23.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>Given a sorted integer array arr, two integers k and x, return the k closest integers to x in the array. The result should also be sorted in ascending order.</p><p>An integer a is closer to x than an integer b if:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">|a - x| &lt; |b - x|, or</span><br><span class="line">|a - x| == |b - x| and a &lt; b</span><br></pre></td></tr></table></figure><p>Example 1:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: arr = [1,2,3,4,5], k = 4, x = 3</span><br><span class="line">Output: [1,2,3,4]</span><br></pre></td></tr></table></figure><p>Example 2:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: arr = [1,2,3,4,5], k = 4, x = -1</span><br><span class="line">Output: [1,2,3,4]</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">1 &lt;= k &lt;= arr.length</span><br><span class="line">1 &lt;= arr.length &lt;= 104</span><br><span class="line">arr is sorted in ascending order.</span><br><span class="line">-104 &lt;= arr[i], x &lt;= 104</span><br></pre></td></tr></table></figure><h2 id="Solutions"><a href="#Solutions" class="headerlink" title="Solutions"></a>Solutions</h2><p>The answer must be a continuous window; numbers are excluded from the left and right ends of the window, leaving k numbers at the end</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># O(n) time | O(1) space</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">findClosestElements</span>(<span class="params">self, arr: <span class="type">List</span>[<span class="built_in">int</span>], k: <span class="built_in">int</span>, x: <span class="built_in">int</span></span>) -&gt; <span class="type">List</span>[<span class="built_in">int</span>]:</span><br><span class="line">        n = <span class="built_in">len</span>(arr)</span><br><span class="line">        left, right = <span class="number">0</span>, n-<span class="number">1</span></span><br><span class="line">        remaining = n - k</span><br><span class="line">        ans = []</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(remaining):</span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">abs</span>(arr[left] - x) &gt; <span class="built_in">abs</span>(arr[right] - x):</span><br><span class="line">                left +=<span class="number">1</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                right -=<span class="number">1</span></span><br><span class="line">        </span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(left, right+<span class="number">1</span>):</span><br><span class="line">            ans.append(arr[i])</span><br><span class="line">        <span class="keyword">return</span> ans</span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/find-k-closest-elements/">658. Find K Closest Elements</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 86. Leetcode: 280/2736</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="medium" scheme="https://hannahweng.xyz/tags/medium/"/>
    
    <category term="Two Pointers" scheme="https://hannahweng.xyz/tags/Two-Pointers/"/>
    
  </entry>
  
  <entry>
    <title>LC240 - Search a 2D Matrix II</title>
    <link href="https://hannahweng.xyz/2022/08/14/LC240SearchA2DMatrixII/"/>
    <id>https://hannahweng.xyz/2022/08/14/LC240SearchA2DMatrixII/</id>
    <published>2022-08-14T01:26:57.000Z</published>
    <updated>2022-08-14T01:26:57.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>Write an efficient algorithm that searches for a value target in an m x n integer matrix matrix. This matrix has the following properties:<br>Integers in each row are sorted in ascending from left to right.<br>Integers in each column are sorted in ascending from top to bottom.</p><p>Example 1:</p><img src="/2022/08/14/LC240SearchA2DMatrixII/e1.jpeg" class="" title="e1"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5</span><br><span class="line">Output: true</span><br></pre></td></tr></table></figure><p>Example 2:</p><img src="/2022/08/14/LC240SearchA2DMatrixII/e2.jpeg" class="" title="e1"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20</span><br><span class="line">Output: false</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">m == matrix.length</span><br><span class="line">n == matrix[i].length</span><br><span class="line">1 &lt;= n, m &lt;= 300</span><br><span class="line">-109 &lt;= matrix[i][j] &lt;= 109</span><br><span class="line">All the integers in each row are sorted in ascending order.</span><br><span class="line">All the integers in each column are sorted in ascending order.</span><br><span class="line">-109 &lt;= target &lt;= 109</span><br></pre></td></tr></table></figure><h2 id="Solution"><a href="#Solution" class="headerlink" title="Solution"></a>Solution</h2><p>BFS<br>Start the search from the upper right corner</p><ul><li>search down if it is smaller than the target</li><li>search to the left if it is larger than the target)</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">searchMatrix</span>(<span class="params">self, matrix: <span class="type">List</span>[<span class="type">List</span>[<span class="built_in">int</span>]], target: <span class="built_in">int</span></span>) -&gt; <span class="built_in">bool</span>:</span><br><span class="line">        m, n = <span class="built_in">len</span>(matrix), <span class="built_in">len</span>(matrix[<span class="number">0</span>])</span><br><span class="line">        queue = deque([(<span class="number">0</span>,n-<span class="number">1</span>)])</span><br><span class="line">        visited = <span class="built_in">set</span>()</span><br><span class="line">        <span class="keyword">while</span> queue:</span><br><span class="line">            x, y = queue.popleft()</span><br><span class="line">            cur_val = matrix[x][y]</span><br><span class="line">            <span class="keyword">if</span> cur_val == target:</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">            </span><br><span class="line">            <span class="keyword">if</span> cur_val &lt; target:</span><br><span class="line">                nx, ny = x+<span class="number">1</span>, y</span><br><span class="line">                <span class="keyword">if</span> <span class="number">0</span>&lt;= nx &lt; m <span class="keyword">and</span> <span class="number">0</span>&lt;= ny &lt; n <span class="keyword">and</span> (nx, ny) <span class="keyword">not</span> <span class="keyword">in</span> visited:</span><br><span class="line">                    queue.append((nx, ny))</span><br><span class="line">                    visited.add((nx, ny))</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                nx, ny = x, y-<span class="number">1</span></span><br><span class="line">                <span class="keyword">if</span> <span class="number">0</span>&lt;= nx &lt; m <span class="keyword">and</span> <span class="number">0</span>&lt;= ny &lt; n <span class="keyword">and</span> (nx, ny) <span class="keyword">not</span> <span class="keyword">in</span> visited:</span><br><span class="line">                    queue.append((nx, ny))</span><br><span class="line">                    visited.add((nx, ny))</span><br><span class="line">            </span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/search-a-2d-matrix-ii/">240. Search a 2D Matrix II</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 74. Leetcode: 258/2736</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="medium" scheme="https://hannahweng.xyz/tags/medium/"/>
    
    <category term="Breadth First Search" scheme="https://hannahweng.xyz/tags/Breadth-First-Search/"/>
    
  </entry>
  
  <entry>
    <title>LC1282 - Group the People Given the Group Size They Belong To</title>
    <link href="https://hannahweng.xyz/2022/08/12/LC1282GroupthePeopleGiventheGroupSizeTheyBelongTo/"/>
    <id>https://hannahweng.xyz/2022/08/12/LC1282GroupthePeopleGiventheGroupSizeTheyBelongTo/</id>
    <published>2022-08-12T12:15:23.000Z</published>
    <updated>2022-08-12T12:15:23.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>There are n people that are split into some unknown number of groups. Each person is labeled with a unique ID from 0 to n - 1.<br>You are given an integer array groupSizes, where groupSizes[i] is the size of the group that person i is in. For example, if groupSizes[1] &#x3D; 3, then person 1 must be in a group of size 3.<br>Return a list of groups such that each person i is in a group of size groupSizes[i].<br>Each person should appear in exactly one group, and every person must be in a group. If there are multiple answers, return any of them. It is guaranteed that there will be at least one valid solution for the given input.</p><p>Example 1:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Input: groupSizes = [3,3,3,3,3,1,3]</span><br><span class="line">Output: [[5],[0,1,2],[3,4,6]]</span><br><span class="line">Explanation: </span><br><span class="line">The first group is [5]. The size is 1, and groupSizes[5] = 1.</span><br><span class="line">The second group is [0,1,2]. The size is 3, and groupSizes[0] = groupSizes[1] = groupSizes[2] = 3.</span><br><span class="line">The third group is [3,4,6]. The size is 3, and groupSizes[3] = groupSizes[4] = groupSizes[6] = 3.</span><br><span class="line">Other possible solutions are [[2,1,6],[5],[0,4,3]] and [[5],[0,6,2],[4,3,1]].</span><br></pre></td></tr></table></figure><p>Example 2:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: groupSizes = [2,1,3,3,3,2]</span><br><span class="line">Output: [[1],[0,5],[2,3,4]]</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">groupSizes.length == n</span><br><span class="line">1 &lt;= n &lt;= 500</span><br><span class="line">1 &lt;= groupSizes[i] &lt;= n</span><br></pre></td></tr></table></figure><h2 id="Solutions"><a href="#Solutions" class="headerlink" title="Solutions"></a>Solutions</h2><ol><li>key: length of the group, value: the index of each element</li><li>store them in the dictionary</li><li>for loop value and use v[i:i+k] to slice the string based on the key</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> sortedcontainers <span class="keyword">import</span> SortedList</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">groupThePeople</span>(<span class="params">self, groupSizes: <span class="type">List</span>[<span class="built_in">int</span>]</span>) -&gt; <span class="type">List</span>[<span class="type">List</span>[<span class="built_in">int</span>]]:</span><br><span class="line">        new_group = SortedList()</span><br><span class="line">        <span class="keyword">for</span> i, v <span class="keyword">in</span> <span class="built_in">enumerate</span>(groupSizes):</span><br><span class="line">            new_group.add((v,i))</span><br><span class="line">        <span class="comment"># print(new_group)</span></span><br><span class="line"></span><br><span class="line">        i = <span class="number">0</span></span><br><span class="line">        ans = []</span><br><span class="line">        <span class="keyword">while</span> i &lt; <span class="built_in">len</span>(groupSizes):</span><br><span class="line">            size, y = new_group[i]</span><br><span class="line">            group = []</span><br><span class="line">            <span class="keyword">for</span> s <span class="keyword">in</span> <span class="built_in">range</span>(size):</span><br><span class="line">                group.append(new_group[i+s][<span class="number">1</span>])</span><br><span class="line">            i = i+s+<span class="number">1</span></span><br><span class="line">            ans.append(group)</span><br><span class="line">        <span class="keyword">return</span> ans</span><br><span class="line"></span><br><span class="line"><span class="comment">#Runtime: 234 ms, faster than 5.20% of Python3 online submissions for Group the People Given the Group Size They Belong To.</span></span><br><span class="line"><span class="comment">#Memory Usage: 14.5 MB, less than 17.57% of Python3 online submissions for Group the People Given the Group Size They Belong To.</span></span><br></pre></td></tr></table></figure><p>Optimised HashTable</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">groupThePeople</span>(<span class="params">self, groupSizes: <span class="type">List</span>[<span class="built_in">int</span>]</span>) -&gt; <span class="type">List</span>[<span class="type">List</span>[<span class="built_in">int</span>]]:</span><br><span class="line">        ans = []</span><br><span class="line">        mp = defaultdict(<span class="built_in">list</span>)</span><br><span class="line">        <span class="keyword">for</span> i, v <span class="keyword">in</span> <span class="built_in">enumerate</span>(groupSizes):</span><br><span class="line">            mp[v].append(i)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> k, v <span class="keyword">in</span> mp.items():</span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(v), k):</span><br><span class="line">                ans.append(v[i:i+k])</span><br><span class="line">            </span><br><span class="line">        <span class="keyword">return</span> ans</span><br><span class="line"></span><br><span class="line"><span class="comment">#Runtime: 89 ms, faster than 82.67% of Python3 online submissions for Group the People Given the Group Size They Belong To.</span></span><br><span class="line"><span class="comment">#Memory Usage: 13.9 MB, less than 88.49% of Python3 online submissions for Group the People Given the Group Size They Belong To.</span></span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/group-the-people-given-the-group-size-they-belong-to/">1282. Group the People Given the Group Size They Belong To</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 73. Leetcode: 253/2736</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="medium" scheme="https://hannahweng.xyz/tags/medium/"/>
    
    <category term="Hashmap" scheme="https://hannahweng.xyz/tags/Hashmap/"/>
    
  </entry>
  
  <entry>
    <title>LC1417 - Reformat the String</title>
    <link href="https://hannahweng.xyz/2022/08/12/LC1417ReformatTheString/"/>
    <id>https://hannahweng.xyz/2022/08/12/LC1417ReformatTheString/</id>
    <published>2022-08-12T00:25:45.000Z</published>
    <updated>2022-08-12T00:25:45.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>You are given an alphanumeric string s. (Alphanumeric string is a string consisting of lowercase English letters and digits).<br>You have to find a permutation of the string where no letter is followed by another letter and no digit is followed by another digit. That is, no two adjacent characters have the same type.<br>Return the reformatted string or return an empty string if it is impossible to reformat the string.</p><p>Example 1:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: s = &quot;a0b1c2&quot;</span><br><span class="line">Output: &quot;0a1b2c&quot;</span><br><span class="line">Explanation: No two adjacent characters have the same type in &quot;0a1b2c&quot;. &quot;a0b1c2&quot;, &quot;0a1b2c&quot;, &quot;0c2a1b&quot; are also valid permutations.</span><br></pre></td></tr></table></figure><p>Example 2:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: s = &quot;leetcode&quot;</span><br><span class="line">Output: &quot;&quot;</span><br><span class="line">Explanation: &quot;leetcode&quot; has only characters so we cannot separate them by digits.</span><br></pre></td></tr></table></figure><p>Example 3:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: s = &quot;1229857369&quot;</span><br><span class="line">Output: &quot;&quot;</span><br><span class="line">Explanation: &quot;1229857369&quot; has only digits so we cannot separate them by characters.</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">1 &lt;= s.length &lt;= 500</span><br><span class="line">s consists of only lowercase English letters and/or digits.</span><br></pre></td></tr></table></figure><h2 id="Solutions"><a href="#Solutions" class="headerlink" title="Solutions"></a>Solutions</h2><ol><li>Traverse s and store letters and numbers in two different lists: nums, letters</li><li>If the difference between the lengths of len(nums) and len(letters) is greater than 1, return “” directly</li><li>If len(nums) ≥ len(letters), append the value of nums first in the result, and vice versa</li><li>If there are remaining values, append to ans</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># O(n) time | O(n) space</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">reformat</span>(<span class="params">self, s: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        nums, letters = [],  []</span><br><span class="line">        ans = []</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> s:</span><br><span class="line">            <span class="keyword">if</span> i.isdigit():</span><br><span class="line">                nums.append(i)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                letters.append(i)</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># print(nums, letters)</span></span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">abs</span>(<span class="built_in">len</span>(nums) - <span class="built_in">len</span>(letters)) &gt; <span class="number">1</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            i = <span class="number">0</span></span><br><span class="line">            <span class="keyword">while</span> i &lt;<span class="built_in">min</span>(<span class="built_in">len</span>(nums), <span class="built_in">len</span>(letters)):</span><br><span class="line">                <span class="keyword">if</span> <span class="built_in">len</span>(nums) &gt;= <span class="built_in">len</span>(letters):</span><br><span class="line">                    ans.append(nums[i])</span><br><span class="line">                    ans.append(letters[i])</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    ans.append(letters[i])</span><br><span class="line">                    ans.append(nums[i])</span><br><span class="line">                i+=<span class="number">1</span></span><br><span class="line">            <span class="keyword">if</span> i &lt; <span class="built_in">len</span>(nums):</span><br><span class="line">                ans.append(nums[-<span class="number">1</span>])</span><br><span class="line">            <span class="keyword">if</span> i &lt; <span class="built_in">len</span>(letters):</span><br><span class="line">                ans.append(letters[-<span class="number">1</span>])</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;&quot;</span>.join(ans)</span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/reformat-the-string/">1417. Reformat The String</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 72. Leetcode: 249/2736</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="easy" scheme="https://hannahweng.xyz/tags/easy/"/>
    
    <category term="Simulation" scheme="https://hannahweng.xyz/tags/Simulation/"/>
    
  </entry>
  
  <entry>
    <title>LC640 - Solve the Equation</title>
    <link href="https://hannahweng.xyz/2022/08/10/LC640SolvetheEquation/"/>
    <id>https://hannahweng.xyz/2022/08/10/LC640SolvetheEquation/</id>
    <published>2022-08-10T22:47:12.000Z</published>
    <updated>2022-08-10T22:47:12.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>Solve a given equation and return the value of ‘x’ in the form of a string “x&#x3D;#value”. The equation contains only ‘+’, ‘-‘ operation, the variable ‘x’ and its coefficient. You should return “No solution” if there is no solution for the equation, or “Infinite solutions” if there are infinite solutions for the equation.<br>If there is exactly one solution for the equation, we ensure that the value of ‘x’ is an integer.</p><p>Example 1:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: equation = &quot;x+5-3+x=6+x-2&quot;</span><br><span class="line">Output: &quot;x=2&quot;</span><br></pre></td></tr></table></figure><p>Example 2:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: equation = &quot;x=x&quot;</span><br><span class="line">Output: &quot;Infinite solutions&quot;</span><br></pre></td></tr></table></figure><p>Example 3:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: equation = &quot;2x=x&quot;</span><br><span class="line">Output: &quot;x=0&quot;</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">3 &lt;= equation.length &lt;= 1000</span><br><span class="line">equation has exactly one &#x27;=&#x27;.</span><br><span class="line">equation consists of integers with an absolute value in the range [0, 100] without any leading zeros, and the variable &#x27;x&#x27;.</span><br></pre></td></tr></table></figure><h2 id="Solution"><a href="#Solution" class="headerlink" title="Solution"></a>Solution</h2><ol><li>Move all expressions to the left</li><li>Then all minus signs are preceded by a plus sign as a prefix</li><li>Divide the equation by plus sign</li><li>Count the number of x and the operation result of the number</li><li>Get results based on the requirements</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">solveEquation</span>(<span class="params">self, equation: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        left, right = equation.split(<span class="string">&quot;=&quot;</span>)</span><br><span class="line">        new_left = []</span><br><span class="line">        new_right = []</span><br><span class="line">        <span class="keyword">if</span> right[<span class="number">0</span>] != <span class="string">&quot;-&quot;</span>:</span><br><span class="line">            right = <span class="string">&quot;+&quot;</span> + right</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(left)):</span><br><span class="line">            <span class="keyword">if</span> left[i] == <span class="string">&quot;-&quot;</span>:</span><br><span class="line">                new_left.append(<span class="string">&quot;+-&quot;</span>)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                new_left.append(left[i])</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(right)):</span><br><span class="line">            <span class="keyword">if</span> right[i] == <span class="string">&quot;+&quot;</span>:</span><br><span class="line">                new_right.append(<span class="string">&quot;+-&quot;</span>)</span><br><span class="line">            <span class="keyword">elif</span> right[i] == <span class="string">&quot;-&quot;</span>:</span><br><span class="line">                new_right.append(<span class="string">&quot;+&quot;</span>)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                new_right.append(right[i])</span><br><span class="line">        e = <span class="string">&quot;&quot;</span>.join(new_left)+<span class="string">&quot;&quot;</span>.join(new_right)</span><br><span class="line"></span><br><span class="line">        <span class="built_in">print</span>(e.split(<span class="string">&quot;+&quot;</span>))</span><br><span class="line">        </span><br><span class="line">        letter = <span class="number">0</span></span><br><span class="line">        num = <span class="number">0</span></span><br><span class="line">        <span class="keyword">for</span> cur <span class="keyword">in</span> e.split(<span class="string">&quot;+&quot;</span>):</span><br><span class="line">            sign, coe, l = <span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span></span><br><span class="line">            <span class="keyword">if</span> cur:</span><br><span class="line">                <span class="keyword">if</span> cur[<span class="number">0</span>] == <span class="string">&quot;-&quot;</span>:</span><br><span class="line">                    sign = -<span class="number">1</span></span><br><span class="line">                    <span class="keyword">if</span> cur[-<span class="number">1</span>] == <span class="string">&quot;x&quot;</span>:</span><br><span class="line">                        coe = <span class="built_in">int</span>(cur[<span class="number">1</span>:-<span class="number">1</span>]) <span class="keyword">if</span> <span class="built_in">len</span>(cur) &gt; <span class="number">2</span> <span class="keyword">else</span> <span class="number">1</span></span><br><span class="line">                        letter += sign * coe</span><br><span class="line">                    <span class="keyword">else</span>:</span><br><span class="line">                        num += <span class="built_in">int</span>(cur)</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="keyword">if</span> cur[-<span class="number">1</span>] == <span class="string">&quot;x&quot;</span>:</span><br><span class="line">                        coe = <span class="built_in">int</span>(cur[:-<span class="number">1</span>]) <span class="keyword">if</span> <span class="built_in">len</span>(cur) &gt; <span class="number">1</span> <span class="keyword">else</span> <span class="number">1</span></span><br><span class="line">                        letter += sign * coe</span><br><span class="line">                    <span class="keyword">else</span>:</span><br><span class="line">                        num += <span class="built_in">int</span>(cur)</span><br><span class="line">           </span><br><span class="line">        <span class="keyword">if</span> letter == num == <span class="number">0</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;Infinite solutions&quot;</span></span><br><span class="line">        <span class="keyword">elif</span> letter == <span class="number">0</span> <span class="keyword">and</span> num != <span class="number">0</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;No solution&quot;</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            v = <span class="built_in">int</span>(-num / letter)</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;x=&quot;</span>+<span class="built_in">str</span>(v)</span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/solve-the-equation/">640. Solve the Equation</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 71. Leetcode: 248/2736</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="medium" scheme="https://hannahweng.xyz/tags/medium/"/>
    
    <category term="Simulation" scheme="https://hannahweng.xyz/tags/Simulation/"/>
    
  </entry>
  
  <entry>
    <title>LC1413 - Minimum Value to Get Positive Step by Step Sum</title>
    <link href="https://hannahweng.xyz/2022/08/09/LC1413MinimumValuetoGetPositiveStepbyStepSum/"/>
    <id>https://hannahweng.xyz/2022/08/09/LC1413MinimumValuetoGetPositiveStepbyStepSum/</id>
    <published>2022-08-09T21:12:04.000Z</published>
    <updated>2022-08-09T21:12:04.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>Given an array of integers nums, you start with an initial positive value startValue.<br>In each iteration, you calculate the step by step sum of startValue plus elements in nums (from left to right).<br>Return the minimum positive value of startValue such that the step by step sum is never less than 1.</p><p>Example 1:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">Input: nums = [-3,2,-3,4,2]</span><br><span class="line">Output: 5</span><br><span class="line">Explanation: If you choose startValue = 4, in the third iteration your step by step sum is less than 1.</span><br><span class="line">step by step sum</span><br><span class="line">startValue = 4 | startValue = 5 | nums</span><br><span class="line">  (4 -3 ) = 1  | (5 -3 ) = 2    |  -3</span><br><span class="line">  (1 +2 ) = 3  | (2 +2 ) = 4    |   2</span><br><span class="line">  (3 -3 ) = 0  | (4 -3 ) = 1    |  -3</span><br><span class="line">  (0 +4 ) = 4  | (1 +4 ) = 5    |   4</span><br><span class="line">  (4 +2 ) = 6  | (5 +2 ) = 7    |   2</span><br></pre></td></tr></table></figure><p>Example 2:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: nums = [1,2]</span><br><span class="line">Output: 1</span><br><span class="line">Explanation: Minimum start value should be positive. </span><br></pre></td></tr></table></figure><p>Example 3:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: nums = [1,-2,-3]</span><br><span class="line">Output: 5</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">1 &lt;= nums.length &lt;= 100</span><br><span class="line">-100 &lt;= nums[i] &lt;= 100</span><br></pre></td></tr></table></figure><h2 id="Solution"><a href="#Solution" class="headerlink" title="Solution"></a>Solution</h2><p>The smallest positive integer is required.<br>We can get the smallest negative sum, and the answer is the opposite of the negative number + 1</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># O(n) time | O(1) space</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">minStartValue</span>(<span class="params">self, nums: <span class="type">List</span>[<span class="built_in">int</span>]</span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">        ans = <span class="number">0</span></span><br><span class="line">        cur = <span class="number">0</span></span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> nums:</span><br><span class="line">            cur += i</span><br><span class="line">            <span class="keyword">if</span> cur &lt; ans:</span><br><span class="line">                ans = cur</span><br><span class="line">        <span class="keyword">return</span> -ans + <span class="number">1</span></span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/minimum-value-to-get-positive-step-by-step-sum/">1413. Minimum Value to Get Positive Step by Step Sum</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 70. Leetcode: 246/2736</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="easy" scheme="https://hannahweng.xyz/tags/easy/"/>
    
    <category term="Greedy" scheme="https://hannahweng.xyz/tags/Greedy/"/>
    
  </entry>
  
  <entry>
    <title>LC1374 - Generate a String With Characters That Have Odd Counts</title>
    <link href="https://hannahweng.xyz/2022/08/01/LC1374GenerateaStringWithCharactersThatHaveoddCounts/"/>
    <id>https://hannahweng.xyz/2022/08/01/LC1374GenerateaStringWithCharactersThatHaveoddCounts/</id>
    <published>2022-08-01T21:39:23.000Z</published>
    <updated>2022-08-01T21:39:23.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>Given an integer n, return a string with n characters such that each character in such string occurs an odd number of times.<br>The returned string must contain only lowercase English letters. If there are multiples valid strings, return any of them.  </p><p>Example 1:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: n = 4</span><br><span class="line">Output: &quot;pppz&quot;</span><br><span class="line">Explanation: &quot;pppz&quot; is a valid string since the character &#x27;p&#x27; occurs three times and the character &#x27;z&#x27; occurs once. Note that there are many other valid strings such as &quot;ohhh&quot; and &quot;love&quot;.</span><br></pre></td></tr></table></figure><p>Example 2:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: n = 2</span><br><span class="line">Output: &quot;xy&quot;</span><br><span class="line">Explanation: &quot;xy&quot; is a valid string since the characters &#x27;x&#x27; and &#x27;y&#x27; occur once. Note that there are many other valid strings such as &quot;ag&quot; and &quot;ur&quot;.</span><br></pre></td></tr></table></figure><p>Example 3:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: n = 7</span><br><span class="line">Output: &quot;holasss&quot;</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">1 &lt;= n &lt;= 500</span><br></pre></td></tr></table></figure><h2 id="Solutions"><a href="#Solutions" class="headerlink" title="Solutions"></a>Solutions</h2><ul><li>When n is an odd number, you can use one character, which itself is an odd number of times;</li><li>Two characters can be used when n is even, odd+odd&#x3D;even</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">generateTheString</span>(<span class="params">self, n: <span class="built_in">int</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="keyword">if</span> n % <span class="number">2</span> == <span class="number">0</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;a&quot;</span>*(n-<span class="number">1</span>)+<span class="string">&quot;b&quot;</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;a&quot;</span>*n</span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/generate-a-string-with-characters-that-have-odd-counts/">1374. Generate a String With Characters That Have Odd Counts</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 62. Leetcode: 227/2726</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="easy" scheme="https://hannahweng.xyz/tags/easy/"/>
    
    <category term="Simulation" scheme="https://hannahweng.xyz/tags/Simulation/"/>
    
  </entry>
  
  <entry>
    <title>LC1161 - Maximum Level Sum of a Binary Tree</title>
    <link href="https://hannahweng.xyz/2022/08/01/LC1161MaximumLevelSumofaBinaryTree/"/>
    <id>https://hannahweng.xyz/2022/08/01/LC1161MaximumLevelSumofaBinaryTree/</id>
    <published>2022-08-01T21:23:49.000Z</published>
    <updated>2022-08-01T21:23:49.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>Given the root of a binary tree, the level of its root is 1, the level of its children is 2, and so on.<br>Return the smallest level x such that the sum of all the values of nodes at level x is maximal.</p><p>Example 1:</p><img src="/2022/08/01/LC1161MaximumLevelSumofaBinaryTree/e1.png" class="" title="e1"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Input: root = [1,7,0,7,-8,null,null]</span><br><span class="line">Output: 2</span><br><span class="line">Explanation: </span><br><span class="line">Level 1 sum = 1.</span><br><span class="line">Level 2 sum = 7 + 0 = 7.</span><br><span class="line">Level 3 sum = 7 + -8 = -1.</span><br><span class="line">So we return the level with the maximum sum which is level 2.</span><br></pre></td></tr></table></figure><p>Example 2:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: root = [989,null,10250,98693,-89388,null,null,null,-32127]</span><br><span class="line">Output: 2</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">The number of nodes in the tree is in the range [1, 104].</span><br><span class="line">-105 &lt;= Node.val &lt;= 105</span><br></pre></td></tr></table></figure><h2 id="Solution"><a href="#Solution" class="headerlink" title="Solution"></a>Solution</h2><p>BFS counts the sum of each layer, and returns the one with the largest sum and the smallest number of layers.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"># class TreeNode:</span></span><br><span class="line"><span class="comment">#     def __init__(self, val=0, left=None, right=None):</span></span><br><span class="line"><span class="comment">#         self.val = val</span></span><br><span class="line"><span class="comment">#         self.left = left</span></span><br><span class="line"><span class="comment">#         self.right = right</span></span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">maxLevelSum</span>(<span class="params">self, root: <span class="type">Optional</span>[TreeNode]</span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">        queue = deque([root])</span><br><span class="line">        maxi = <span class="built_in">float</span>(<span class="string">&#x27;-inf&#x27;</span>)</span><br><span class="line">        level = <span class="number">1</span></span><br><span class="line">        ans = <span class="number">0</span></span><br><span class="line">        <span class="keyword">while</span> queue:</span><br><span class="line">            l = <span class="built_in">len</span>(queue)</span><br><span class="line">            summ = <span class="number">0</span></span><br><span class="line">            <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(l):</span><br><span class="line">                cur = queue.popleft()</span><br><span class="line">                summ += cur.val</span><br><span class="line">                <span class="keyword">if</span> cur.left:</span><br><span class="line">                    queue.append(cur.left)</span><br><span class="line">                <span class="keyword">if</span> cur.right:</span><br><span class="line">                    queue.append(cur.right)</span><br><span class="line">            <span class="keyword">if</span> summ &gt; maxi:</span><br><span class="line">                maxi = summ</span><br><span class="line">                ans = level</span><br><span class="line">            level+=<span class="number">1</span></span><br><span class="line">        <span class="keyword">return</span> ans</span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/maximum-level-sum-of-a-binary-tree/">1161. Maximum Level Sum of a Binary Tree</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 61. Leetcode: 226/2726</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="medium" scheme="https://hannahweng.xyz/tags/medium/"/>
    
    <category term="Breadth First Search" scheme="https://hannahweng.xyz/tags/Breadth-First-Search/"/>
    
  </entry>
  
  <entry>
    <title>PyTorch Tutorial - Linear Regression With PyTorch</title>
    <link href="https://hannahweng.xyz/2022/07/26/PyTorch-P5/"/>
    <id>https://hannahweng.xyz/2022/07/26/PyTorch-P5/</id>
    <published>2022-07-26T23:11:22.000Z</published>
    <updated>2022-07-26T23:11:22.000Z</updated>
    
    <content type="html"><![CDATA[<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> torch</span><br><span class="line"></span><br><span class="line"><span class="comment"># step 1: prepare the dataset</span></span><br><span class="line">x_data = torch.tensor([[<span class="number">1.0</span>],[<span class="number">2.0</span>],[<span class="number">3.0</span>]])</span><br><span class="line">y_data = torch.tensor([[<span class="number">2.0</span>],[<span class="number">4.0</span>],[<span class="number">6.0</span>]])</span><br><span class="line"></span><br><span class="line"><span class="comment"># step2: design model</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">Our model class should inherit from torch.nn.Module, which is the base class for all of the neural networks.</span></span><br><span class="line"><span class="string">__init__() and forward() have to be implemented.</span></span><br><span class="line"><span class="string">class nn.Linear contains two Tensor components: weight and bias</span></span><br><span class="line"><span class="string">class nn.Linear has implemented the magic method __call__(), which enable the instance of the class to be called like a function.</span></span><br><span class="line"><span class="string">therefore, model(data) can call the forward function</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">LinearModel</span>(torch.nn.Module):</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="built_in">super</span>(LinearModel, <span class="variable language_">self</span>).__init__()</span><br><span class="line">        <span class="comment"># (1, 1) is the sie of each input sample and output sample</span></span><br><span class="line">        <span class="comment"># parameters in this model: weights and bias</span></span><br><span class="line">        <span class="comment"># model: y = xm + b</span></span><br><span class="line">        <span class="variable language_">self</span>.linear = torch.nn.Linear(<span class="number">1</span>, <span class="number">1</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">forward</span>(<span class="params">self, x</span>):</span><br><span class="line">        y_pred = <span class="variable language_">self</span>.linear(x)</span><br><span class="line">        <span class="keyword">return</span> y_pred</span><br><span class="line"></span><br><span class="line">model = LinearModel()</span><br><span class="line"></span><br><span class="line"><span class="comment"># step3: construct loss and optimizer</span></span><br><span class="line">criterion = torch.nn.MSELoss(size_average = <span class="literal">False</span>)</span><br><span class="line">optimizer = torch.optim.SGD(model.parameters(), lr = <span class="number">0.01</span>) <span class="comment">#iterable of parameters to optimizer. model.parameters() can get all the parameters in the model</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># step4: training cycle - forward, backward, update</span></span><br><span class="line"><span class="keyword">for</span> epoch <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1000</span>):</span><br><span class="line">    y_pred = model(x_data)</span><br><span class="line">    loss = criterion(y_pred, y_data)</span><br><span class="line">    <span class="built_in">print</span>(epoch, loss.item())</span><br><span class="line"></span><br><span class="line">    optimizer.zero_grad() <span class="comment"># the grad will be accumulated, so before backward, we need to set the grad to zero</span></span><br><span class="line">    loss.backward() <span class="comment"># backward: autograd</span></span><br><span class="line">    optimizer.step() <span class="comment"># update w, b</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;w=&#x27;</span>, model.linear.weight.item())</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;b=&#x27;</span>, model.linear.weight.item())</span><br><span class="line"></span><br><span class="line"><span class="comment"># step5: test model</span></span><br><span class="line">x_test = torch.tensor([<span class="number">4.0</span>])</span><br><span class="line">y_test = model(x_test)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;y_pred= &#x27;</span>, y_test.data)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 980 3.610836074585677e-10</span></span><br><span class="line"><span class="comment"># 981 3.6504843592410907e-10</span></span><br><span class="line"><span class="comment"># 982 3.5726088754017837e-10</span></span><br><span class="line"><span class="comment"># 983 3.4162894735345617e-10</span></span><br><span class="line"><span class="comment"># 984 3.445990159889334e-10</span></span><br><span class="line"><span class="comment"># 985 3.355609123900649e-10</span></span><br><span class="line"><span class="comment"># 986 3.370388412804459e-10</span></span><br><span class="line"><span class="comment"># 987 3.249738256272394e-10</span></span><br><span class="line"><span class="comment"># 988 3.1610625228495337e-10</span></span><br><span class="line"><span class="comment"># 989 3.1587887860951014e-10</span></span><br><span class="line"><span class="comment"># 990 3.1248248433257686e-10</span></span><br><span class="line"><span class="comment"># 991 3.1373303954751464e-10</span></span><br><span class="line"><span class="comment"># 992 3.1042191039887257e-10</span></span><br><span class="line"><span class="comment"># 993 3.0178171073202975e-10</span></span><br><span class="line"><span class="comment"># 994 3.0526337013725424e-10</span></span><br><span class="line"><span class="comment"># 995 2.9184832328610355e-10</span></span><br><span class="line"><span class="comment"># 996 2.9478997021215037e-10</span></span><br><span class="line"><span class="comment"># 997 2.864908310584724e-10</span></span><br><span class="line"><span class="comment"># 998 2.8178703814774053e-10</span></span><br><span class="line"><span class="comment"># 999 2.765574436125462e-10</span></span><br><span class="line"><span class="comment"># w= 2.0000112056732178</span></span><br><span class="line"><span class="comment"># b= 2.0000112056732178</span></span><br><span class="line"><span class="comment"># y_pred=  tensor([8.0000])</span></span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://www.bilibili.com/video/BV1Y7411d7Ys?p=5">PyTorch Tutorial - P5 Linear Regression with PyTorch</a></p>]]></content>
    
    
    <summary type="html">Lecture5 -- Bilibili: PyTorch Tutorial; Lecturer: Hongpu Liu</summary>
    
    
    
    <category term="Data Science" scheme="https://hannahweng.xyz/categories/Data-Science/"/>
    
    
    <category term="PyTorch" scheme="https://hannahweng.xyz/tags/PyTorch/"/>
    
  </entry>
  
  <entry>
    <title>LC433 - Minimum Genetic Mutation</title>
    <link href="https://hannahweng.xyz/2022/07/24/LC433MinimumGeneticMutation/"/>
    <id>https://hannahweng.xyz/2022/07/24/LC433MinimumGeneticMutation/</id>
    <published>2022-07-24T17:39:18.000Z</published>
    <updated>2022-07-24T17:39:18.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>A gene string can be represented by an 8-character long string, with choices from ‘A’, ‘C’, ‘G’, and ‘T’.<br>Suppose we need to investigate a mutation from a gene string start to a gene string end where one mutation is defined as one single character changed in the gene string.<br>For example, “AACCGGTT” –&gt; “AACCGGTA” is one mutation.<br>There is also a gene bank bank that records all the valid gene mutations. A gene must be in bank to make it a valid gene string.<br>Given the two gene strings start and end and the gene bank bank, return the minimum number of mutations needed to mutate from start to end. If there is no such a mutation, return -1.<br>Note that the starting point is assumed to be valid, so it might not be included in the bank.</p><p>Example 1:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: start = &quot;AACCGGTT&quot;, end = &quot;AACCGGTA&quot;, bank = [&quot;AACCGGTA&quot;]</span><br><span class="line">Output: 1</span><br></pre></td></tr></table></figure><p>Example 2:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: start = &quot;AACCGGTT&quot;, end = &quot;AAACGGTA&quot;, bank = [&quot;AACCGGTA&quot;,&quot;AACCGCTA&quot;,&quot;AAACGGTA&quot;]</span><br><span class="line">Output: 2</span><br></pre></td></tr></table></figure><p>Example 3:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: start = &quot;AAAAACCC&quot;, end = &quot;AACCCCCC&quot;, bank = [&quot;AAAACCCC&quot;,&quot;AAACCCCC&quot;,&quot;AACCCCCC&quot;]</span><br><span class="line">Output: 3</span><br></pre></td></tr></table></figure><p>Constraints:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">start.length == 8</span><br><span class="line">end.length == 8</span><br><span class="line">0 &lt;= bank.length &lt;= 10</span><br><span class="line">bank[i].length == 8</span><br><span class="line">start, end, and bank[i] consist of only the characters [&#x27;A&#x27;, &#x27;C&#x27;, &#x27;G&#x27;, &#x27;T&#x27;].</span><br></pre></td></tr></table></figure><h2 id="Solution"><a href="#Solution" class="headerlink" title="Solution"></a>Solution</h2><p>This question is very similar to <strong>[127]</strong><br>If end is not in the bank, return -1 directly</p><ul><li>Store start in the queue, because there are only four letters of ACGT, so traverse the gene sequence and change one of the letters. If the changed letter is not in visited, put it in the queue</li><li>If the changed letter is equal to the value of end, return to step</li><li>If no matching gene is found, return -1</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># O(nm) time | O(nm) space</span></span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">minMutation</span>(<span class="params">self, start: <span class="built_in">str</span>, end: <span class="built_in">str</span>, bank: <span class="type">List</span>[<span class="built_in">str</span>]</span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">        <span class="keyword">if</span> end <span class="keyword">not</span> <span class="keyword">in</span> bank:</span><br><span class="line">            <span class="keyword">return</span> -<span class="number">1</span></span><br><span class="line">        </span><br><span class="line">        queue = deque([(start,<span class="number">0</span>)])</span><br><span class="line">        visited = <span class="built_in">set</span>(&#123;start&#125;)</span><br><span class="line">        <span class="keyword">while</span> queue:</span><br><span class="line">            cur, step = queue.popleft()</span><br><span class="line">            <span class="keyword">if</span> cur == end:</span><br><span class="line">                <span class="keyword">return</span> step</span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">8</span>):</span><br><span class="line">                <span class="keyword">for</span> j <span class="keyword">in</span> [<span class="string">&quot;A&quot;</span>,<span class="string">&quot;C&quot;</span>,<span class="string">&quot;G&quot;</span>, <span class="string">&quot;T&quot;</span>]:</span><br><span class="line">                    nxt = cur[:i]+j+cur[i+<span class="number">1</span>:]</span><br><span class="line">                    <span class="keyword">if</span> nxt <span class="keyword">in</span> bank <span class="keyword">and</span> nxt <span class="keyword">not</span> <span class="keyword">in</span> visited:</span><br><span class="line">                        queue.append((nxt, step+<span class="number">1</span>))</span><br><span class="line">                        visited.add(nxt)</span><br><span class="line">        <span class="keyword">return</span> -<span class="number">1</span></span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/minimum-genetic-mutation/">433. Minimum Genetic Mutation</a><br>[^2]: <a href="https://leetcode.com/problems/word-ladder/">127. Word Ladder</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 54. Leetcode: 216/2710</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="medium" scheme="https://hannahweng.xyz/tags/medium/"/>
    
    <category term="Breadth First Search" scheme="https://hannahweng.xyz/tags/Breadth-First-Search/"/>
    
  </entry>
  
  <entry>
    <title>LC2049 - Count Nodes With the Highest Score</title>
    <link href="https://hannahweng.xyz/2022/07/22/LC2049CountNodesWiththeHighestScore/"/>
    <id>https://hannahweng.xyz/2022/07/22/LC2049CountNodesWiththeHighestScore/</id>
    <published>2022-07-22T14:36:21.000Z</published>
    <updated>2022-07-22T14:36:21.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>There is a binary tree rooted at 0 consisting of n nodes. The nodes are labeled from 0 to n - 1. You are given a 0-indexed integer array parents representing the tree, where parents[i] is the parent of node i. Since node 0 is the root, parents[0] &#x3D;&#x3D; -1.<br>Each node has a score. To find the score of a node, consider if the node and the edges connected to it were removed. The tree would become one or more non-empty subtrees. The size of a subtree is the number of the nodes in it. The score of the node is the product of the sizes of all those subtrees.<br>Return the number of nodes that have the highest score.</p><p>Example 1:</p><img src="/2022/07/22/LC2049CountNodesWiththeHighestScore/e1.png" class="" title="e1"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Input: parents = [-1,2,0,2,0]</span><br><span class="line">Output: 3</span><br><span class="line">Explanation:</span><br><span class="line">- The score of node 0 is: 3 * 1 = 3</span><br><span class="line">- The score of node 1 is: 4 = 4</span><br><span class="line">- The score of node 2 is: 1 * 1 * 2 = 2</span><br><span class="line">- The score of node 3 is: 4 = 4</span><br><span class="line">- The score of node 4 is: 4 = 4</span><br><span class="line">The highest score is 4, and three nodes (node 1, node 3, and node 4) have the highest score.</span><br></pre></td></tr></table></figure><p>Example 2:</p><img src="/2022/07/22/LC2049CountNodesWiththeHighestScore/e2.png" class="" title="e2"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Input: parents = [-1,2,0]</span><br><span class="line">Output: 2</span><br><span class="line">Explanation:</span><br><span class="line">- The score of node 0 is: 2 = 2</span><br><span class="line">- The score of node 1 is: 2 = 2</span><br><span class="line">- The score of node 2 is: 1 * 1 = 1</span><br><span class="line">The highest score is 2, and two nodes (node 0 and node 1) have the highest score.</span><br></pre></td></tr></table></figure><p>Constraints:<br>n &#x3D;&#x3D; parents.length<br>2 &lt;&#x3D; n &lt;&#x3D; 105<br>parents[0] &#x3D;&#x3D; -1<br>0 &lt;&#x3D; parents[i] &lt;&#x3D; n - 1 for i !&#x3D; 0<br>parents represents a valid binary tree.</p><h2 id="Solutions"><a href="#Solutions" class="headerlink" title="Solutions"></a>Solutions</h2><img src="/2022/07/22/LC2049CountNodesWiththeHighestScore/s.png" class="" title="s"><ol><li>Store the number of in-degree nodes for each node in degree</li><li>Store the parent node and child node of the current node in two hash tables respectively</li><li>The final answer is the product of the number of remaining nodes of the parent node to be deleted and the number of nodes of the self node.</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">countHighestScoreNodes</span>(<span class="params">self, parents: <span class="type">List</span>[<span class="built_in">int</span>]</span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">        n = <span class="built_in">len</span>(parents)</span><br><span class="line">        degree = [<span class="number">0</span>]*n</span><br><span class="line">        fathers = defaultdict(<span class="built_in">list</span>)</span><br><span class="line">        total = [<span class="number">1</span>]*n</span><br><span class="line">        children = defaultdict(<span class="built_in">list</span>)</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">for</span> i, v <span class="keyword">in</span> <span class="built_in">enumerate</span>(parents[<span class="number">1</span>:],<span class="number">1</span>):</span><br><span class="line">            fathers[i].append(v)</span><br><span class="line">            children[v].append(i)</span><br><span class="line">            degree[v] += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">        queue = deque()</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n):</span><br><span class="line">            <span class="keyword">if</span> degree[i] == <span class="number">0</span>:</span><br><span class="line">                queue.append(i)</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">while</span> queue:</span><br><span class="line">            cur = queue.popleft()</span><br><span class="line">            <span class="keyword">for</span> root <span class="keyword">in</span> fathers[cur]:</span><br><span class="line">                total[root] += total[cur]</span><br><span class="line">                degree[root]-=<span class="number">1</span></span><br><span class="line">                <span class="keyword">if</span> degree[root] == <span class="number">0</span>:</span><br><span class="line">                    queue.append(root)</span><br><span class="line"></span><br><span class="line">        maxi, ans = <span class="number">0</span>, <span class="number">0</span></span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n):</span><br><span class="line">            cur = <span class="number">1</span></span><br><span class="line">            <span class="keyword">for</span> c <span class="keyword">in</span> children[i]:</span><br><span class="line">                cur*=total[c]</span><br><span class="line">            <span class="keyword">if</span> i != <span class="number">0</span>:</span><br><span class="line">                cur*=(total[<span class="number">0</span>] - total[i])</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> cur &gt; maxi:</span><br><span class="line">                maxi = cur</span><br><span class="line">                ans = <span class="number">1</span></span><br><span class="line">            <span class="keyword">elif</span> cur == maxi:</span><br><span class="line">                ans +=<span class="number">1</span></span><br><span class="line">        <span class="keyword">return</span> ans</span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/count-nodes-with-the-highest-score/">2049. Count Nodes With the Highest Score</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 52. Leetcode: 208/2710</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="medium" scheme="https://hannahweng.xyz/tags/medium/"/>
    
    <category term="Breadth First Search" scheme="https://hannahweng.xyz/tags/Breadth-First-Search/"/>
    
    <category term="Topological Sorting" scheme="https://hannahweng.xyz/tags/Topological-Sorting/"/>
    
  </entry>
  
  <entry>
    <title>LC851 - Loud and Rich</title>
    <link href="https://hannahweng.xyz/2022/07/21/LC851LoudAndRich/"/>
    <id>https://hannahweng.xyz/2022/07/21/LC851LoudAndRich/</id>
    <published>2022-07-21T18:07:33.000Z</published>
    <updated>2022-07-21T18:07:33.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>There is a group of n people labeled from 0 to n - 1 where each person has a different amount of money and a different level of quietness.<br>You are given an array richer where richer[i] &#x3D; [ai, bi] indicates that ai has more money than bi and an integer array quiet where quiet[i] is the quietness of the ith person. All the given data in richer are logically correct (i.e., the data will not lead you to a situation where x is richer than y and y is richer than x at the same time).<br>Return an integer array answer where answer[x] &#x3D; y if y is the least quiet person (that is, the person y with the smallest value of quiet[y]) among all people who definitely have equal to or more money than the person x.</p><p>Example 1:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Input: richer = [[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], quiet = [3,2,5,4,6,1,7,0]</span><br><span class="line">Output: [5,5,2,5,4,5,6,7]</span><br><span class="line">Explanation: </span><br><span class="line">answer[0] = 5.</span><br><span class="line">Person 5 has more money than 3, which has more money than 1, which has more money than 0.</span><br><span class="line">The only person who is quieter (has lower quiet[x]) is person 7, but it is not clear if they have more money than person 0.</span><br><span class="line">answer[7] = 7.</span><br><span class="line">Among all people that definitely have equal to or more money than person 7 (which could be persons 3, 4, 5, 6, or 7), the person who is the quietest (has lower quiet[x]) is person 7.</span><br><span class="line">The other answers can be filled out with similar reasoning.</span><br></pre></td></tr></table></figure><p>Example 2:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: richer = [], quiet = [0]</span><br><span class="line">Output: [0]</span><br></pre></td></tr></table></figure><p>Constraints:<br>n &#x3D;&#x3D; quiet.length<br>1 &lt;&#x3D; n &lt;&#x3D; 500<br>0 &lt;&#x3D; quiet[i] &lt; n<br>All the values of quiet are unique.<br>0 &lt;&#x3D; richer.length &lt;&#x3D; n * (n - 1) &#x2F; 2<br>0 &lt;&#x3D; ai, bi &lt; n<br>ai !&#x3D; bi<br>All the pairs of richer are unique.<br>The observations in richer are all logically consistent.</p><h2 id="Solution"><a href="#Solution" class="headerlink" title="Solution"></a>Solution</h2><img src="/2022/07/21/LC851LoudAndRich/s1.png" class="" title="s1"><ol><li>Draw the graph as required</li><li>Create a mapping table 【connect】: <ul><li>key: the vertex of the in-degree</li><li>value: which elements will this vertex of the in-degree point to</li></ul></li><li>Create an in-degree table 【degree】 ：<ul><li>key: the value of the vertex;<br> value: how many in-degree elements there are, for example, vertex 3 has 3 in-degree elements (if the vertex is an index, we only need to create an array&#x2F;list)</li></ul></li><li>Find the key&#x2F;index that are 0 in the in-degree table, that is, 2, 3, 5, 6, and put these values in the queue</li><li>Compare the quiet value of the current popleft value and the quiet value of the outdegree element, and update the element</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># O(n+m) time | O(n+m) space</span></span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">loudAndRich</span>(<span class="params">self, richer: <span class="type">List</span>[<span class="type">List</span>[<span class="built_in">int</span>]], quiet: <span class="type">List</span>[<span class="built_in">int</span>]</span>) -&gt; <span class="type">List</span>[<span class="built_in">int</span>]:</span><br><span class="line">        n = <span class="built_in">len</span>(quiet)</span><br><span class="line">        connect = defaultdict(<span class="built_in">list</span>)</span><br><span class="line">        degree = [<span class="number">0</span>]*n</span><br><span class="line">        queue = deque()</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">for</span> cur, nxt <span class="keyword">in</span> richer:</span><br><span class="line">            connect[cur].append(nxt)</span><br><span class="line">            degree[nxt] +=<span class="number">1</span></span><br><span class="line">        </span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n):</span><br><span class="line">            <span class="keyword">if</span> degree[i] == <span class="number">0</span>:</span><br><span class="line">                queue.append(i)</span><br><span class="line">        </span><br><span class="line">        ans = [i <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n)]</span><br><span class="line">        <span class="keyword">while</span> queue:</span><br><span class="line">            cur = queue.popleft()</span><br><span class="line">            <span class="keyword">for</span> nxt <span class="keyword">in</span> connect[cur]:</span><br><span class="line">                degree[nxt]-=<span class="number">1</span></span><br><span class="line">                <span class="keyword">if</span> degree[nxt] == <span class="number">0</span>:</span><br><span class="line">                    queue.append(nxt)</span><br><span class="line">                </span><br><span class="line">                <span class="keyword">if</span> quiet[ans[cur]] &lt; quiet[ans[nxt]]:</span><br><span class="line">                    ans[nxt] = ans[cur]</span><br><span class="line">        <span class="keyword">return</span> ans</span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/loud-and-rich/">851. Loud and Rich</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 51. Leetcode: 207/2710</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="medium" scheme="https://hannahweng.xyz/tags/medium/"/>
    
    <category term="Breadth First Search" scheme="https://hannahweng.xyz/tags/Breadth-First-Search/"/>
    
    <category term="Topological Sorting" scheme="https://hannahweng.xyz/tags/Topological-Sorting/"/>
    
  </entry>
  
  <entry>
    <title>LC210 - Course Schedule II</title>
    <link href="https://hannahweng.xyz/2022/07/21/LC210CourseScheduleII/"/>
    <id>https://hannahweng.xyz/2022/07/21/LC210CourseScheduleII/</id>
    <published>2022-07-21T13:01:09.000Z</published>
    <updated>2022-07-21T13:01:09.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>There are a total of numCourses courses you have to take, labeled from 0 to numCourses - 1. You are given an array prerequisites where prerequisites[i] &#x3D; [ai, bi] indicates that you must take course bi first if you want to take course ai.<br>For example, the pair [0, 1], indicates that to take course 0 you have to first take course 1.<br>Return the ordering of courses you should take to finish all courses. If there are many valid answers, return any of them. If it is impossible to finish all courses, return an empty array.</p><p>Example 1:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Input: numCourses = 2, prerequisites = [[1,0]]</span><br><span class="line">Output: [0,1]</span><br><span class="line">Explanation: There are a total of 2 courses to take. To take course 1 you should have finished course 0. So the correct course order is [0,1].</span><br></pre></td></tr></table></figure><p>Example 2:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Input: numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]</span><br><span class="line">Output: [0,2,1,3]</span><br><span class="line">Explanation: There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0.</span><br><span class="line">So one correct course order is [0,1,2,3]. Another correct ordering is [0,2,1,3].</span><br></pre></td></tr></table></figure><p>Example 3:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Input: numCourses = 1, prerequisites = []</span><br><span class="line">Output: [0]</span><br></pre></td></tr></table></figure><p>Constraints:<br>1 &lt;&#x3D; numCourses &lt;&#x3D; 2000<br>0 &lt;&#x3D; prerequisites.length &lt;&#x3D; numCourses * (numCourses - 1)<br>prerequisites[i].length &#x3D;&#x3D; 2<br>0 &lt;&#x3D; ai, bi &lt; numCourses<br>ai !&#x3D; bi<br>All the pairs [ai, bi] are distinct.</p><h2 id="Solution"><a href="#Solution" class="headerlink" title="Solution"></a>Solution</h2><ul><li>Prerequesite is stored in courses: [following courses]</li><li>The number of pre-courses required for each course is stored in pre_nums</li><li>Traverse pre_nums, if the number of pre-courses of the current course is 0, append the course to the queue</li><li>After processing all pre_nums[nxt], enqueue all courses with an in-degree of 0 (meaning subjects without pre-course requirements), and run topological sorting. If the length ans of the sorted courses is equal to numCourses, return ans, otherwise return [].</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#O(n+m) time | O(n+m) space</span></span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">findOrder</span>(<span class="params">self, numCourses: <span class="built_in">int</span>, prerequisites: <span class="type">List</span>[<span class="type">List</span>[<span class="built_in">int</span>]]</span>) -&gt; <span class="type">List</span>[<span class="built_in">int</span>]:</span><br><span class="line">        courses = defaultdict(<span class="built_in">list</span>)</span><br><span class="line">        pre_nums = [<span class="number">0</span>] * numCourses</span><br><span class="line">        queue = deque([])</span><br><span class="line">        <span class="keyword">for</span> cur, pre <span class="keyword">in</span> prerequisites:</span><br><span class="line">            courses[pre].append(cur)</span><br><span class="line">            pre_nums[cur] +=<span class="number">1</span></span><br><span class="line">        </span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(numCourses):</span><br><span class="line">            <span class="keyword">if</span> pre_nums[i] == <span class="number">0</span>:</span><br><span class="line">                queue.append(i)</span><br><span class="line">        </span><br><span class="line">        ans = []</span><br><span class="line">        <span class="keyword">while</span> queue:</span><br><span class="line">            cur = queue.popleft()</span><br><span class="line">            ans.append(cur)</span><br><span class="line">            <span class="keyword">for</span> nxt <span class="keyword">in</span> courses[cur]:</span><br><span class="line">                pre_nums[nxt] -=<span class="number">1</span></span><br><span class="line">                <span class="keyword">if</span> pre_nums[nxt] == <span class="number">0</span>:</span><br><span class="line">                    queue.append(nxt)</span><br><span class="line">        <span class="keyword">return</span> ans <span class="keyword">if</span> <span class="built_in">len</span>(ans) == numCourses <span class="keyword">else</span> []</span><br></pre></td></tr></table></figure><p>[^1]: <a href="https://leetcode.com/problems/course-schedule/">207. Course Schedule</a><br>[^2]: <a href="https://leetcode.com/problems/course-schedule-ii/">210. Course Schedule II</a></p>]]></content>
    
    
    <summary type="html">Datastructure and Algorithm: DAY 51. Leetcode: 206/2710</summary>
    
    
    
    <category term="Leetcode" scheme="https://hannahweng.xyz/categories/Leetcode/"/>
    
    
    <category term="medium" scheme="https://hannahweng.xyz/tags/medium/"/>
    
    <category term="Breadth First Search" scheme="https://hannahweng.xyz/tags/Breadth-First-Search/"/>
    
    <category term="Topological Sorting" scheme="https://hannahweng.xyz/tags/Topological-Sorting/"/>
    
  </entry>
  
</feed>
