<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Neetcode-150 on avni.sh</title>
    <link>http://www.avni.sh/tags/neetcode-150/</link>
    <description>Recent content in Neetcode-150 on avni.sh</description>
    <image>
      <title>avni.sh</title>
      <url>http://www.avni.sh/cover.webp</url>
      <link>http://www.avni.sh/cover.webp</link>
    </image>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Thu, 15 Feb 2024 00:00:00 +0000</lastBuildDate>
    <atom:link href="http://www.avni.sh/tags/neetcode-150/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Reorder Linked Lists</title>
      <link>http://www.avni.sh/posts/data-structures-and-algorithms/reorder-linked-list/</link>
      <pubDate>Thu, 15 Feb 2024 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/data-structures-and-algorithms/reorder-linked-list/</guid>
      <description>Implement a reorderList function that takes the head of a linked list (node(0) -&amp;gt; node(1) -&amp;gt; node(2) -&amp;gt; .. -&amp;gt; node(n-1) -&amp;gt; node(n)) as input and reorders its nodes in the form node(0) -&amp;gt; node(n) -&amp;gt; node(1) -&amp;gt; node(n-1) -&amp;gt; node(2) -&amp;gt; .. .</description>
      <content:encoded><![CDATA[<h1 id="problem-statement">Problem Statement</h1>
<p>We have to implement the <code>reorderList</code> function that takes the <code>head</code> node of a linked list as input and reorders its
nodes in the format specified below.</p>
<p>Given an input list like the following:</p>
<p>$$Node_0 \rightarrow Node_1 \rightarrow Node_2 \rightarrow \dots \rightarrow Node_{(n-2)} \rightarrow Node_{(n-1)} \rightarrow Node_n$$</p>
<p>the <code>reorderList</code> function should reorder its nodes as:</p>
<p>$$Node_0 \rightarrow Node_n \rightarrow Node_1 \rightarrow Node_{(n-1)} \rightarrow Node_2 \rightarrow Node_{(n-2)} \rightarrow \dots$$</p>
<p align="center"><img src="reorder-linked-lists-problem.webp" alt="Problem statement for the reorderList"></p>
<h1 id="brute-force-solution">Brute Force Solution</h1>
<p>To solve this problem we use two iterators: one starting from the <code>head</code> of the input list and another
starting from the <code>head</code> of the <a href="/posts/computer-science/interview-preparation/reverse-linked-lists/" target="_blank">reversed input list</a>.</p>
<p>We pick values alternatively from both iterators and create a new
linked list. The loop will continue until the length of the length of the new linked list is equal to the length of
the input list. The nodes in the new linked list will be ordered as specified in the problem statement.</p>
<p align="center"><img src="reorder-linked-lists-brute-force.webp" alt="Brute-force solution for the reorderList"></p>
<h2 id="psuedo-code-for-the-brute-force-solution">Psuedo-code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">reversed_linked_list = reverseList(linked_list)
</span></span><span class="line"><span class="cl">forward_iter = linked_list.head
</span></span><span class="line"><span class="cl">reverse_iter = reversed_linked_list.head
</span></span><span class="line"><span class="cl">reorderedLinkedList = LinkedList()
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">while(length(reorderedLinkedList)!=length(linked_list)){
</span></span><span class="line"><span class="cl">  reorderedLinkedList.insert(forward_iter)
</span></span><span class="line"><span class="cl">  if(length(reorderedLinkedList)==length(linked_list))
</span></span><span class="line"><span class="cl">    break
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  reorderedLinkedList.insert(reverse_iter)
</span></span><span class="line"><span class="cl">  if(length(reorderedLinkedList)==length(linked_list))
</span></span><span class="line"><span class="cl">    break
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  forward_iter=forward_iter.next
</span></span><span class="line"><span class="cl">  reversed_linked_list=reverse_iter.next
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">return reorderedLinkedList
</span></span></code></pre></div><h2 id="time-complexity-analysis">Time Complexity Analysis</h2>
<h3 id="best-case-scenario">Best Case Scenario</h3>
<p>With this brute-force solution, we have to iterate over the complete linked list, even in the best-case scenario.
The time complexity of the brute-force solution will be $O(n)$ (for iterating over the <code>reorderedList</code>) times
$O(n)$ (for calculating the current length of <code>reorderedList</code>) which will result in the total time complexity of $O(n^2)$.</p>
<h3 id="worst-case-scenario">Worst Case Scenario</h3>
<p>The time complexity of the worst-case scenario will also be $O(n^2)$.</p>
<h2 id="space-complexity-analysis">Space Complexity Analysis</h2>
<p>The brute-force solution is using additional $O(2n)$ memory space to store the reversed and reordered linked list.</p>
<h2 id="code-for-brute-force-solution">Code for Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">ListNode</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Val</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Next</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">Display</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">temp</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%d-&gt;&#34;</span><span class="p">,</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">Val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span><span class="p">=</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">Length</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">)(</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Since this function iterates the complete linked list </span>
</span></span><span class="line"><span class="cl">    <span class="c1">// the time complexity of this function is O(n)</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// where n is the length of the linked list</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">    <span class="nx">length</span> <span class="o">:=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">temp</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">length</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span><span class="p">=</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">length</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">insertAtFront</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">,</span> <span class="nx">value</span> <span class="kt">int</span><span class="p">)(</span><span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Time complexity of inserting a value at the head of the </span>
</span></span><span class="line"><span class="cl">    <span class="c1">// linked list is O(1)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">newNode</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span> <span class="nx">value</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">newNode</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">newNode</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">,</span> <span class="nx">value</span> <span class="kt">int</span><span class="p">)(</span><span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Time complexity of inserting a value at the end of the </span>
</span></span><span class="line"><span class="cl">    <span class="c1">// linked list is O(n)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="nx">ln</span><span class="o">==</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">ln</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span> <span class="nx">value</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span><span class="p">(</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">            <span class="nx">temp</span> <span class="p">=</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span> <span class="nx">value</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">reverseList</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">)(</span><span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Time complexity of reversing a linked list is O(n)</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// where n is the length of the linked list</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">reversedList</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">temp</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">reversedList</span> <span class="p">=</span> <span class="nf">insertAtFront</span><span class="p">(</span><span class="nx">reversedList</span><span class="p">,</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">Val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span><span class="p">=</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">reversedList</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">reorderList</span><span class="p">(</span><span class="nx">head</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">forwardIter</span> <span class="o">:=</span> <span class="nx">head</span>
</span></span><span class="line"><span class="cl">    <span class="nx">reverseIter</span> <span class="o">:=</span> <span class="nf">reverseList</span><span class="p">(</span><span class="nx">head</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">inputListLength</span> <span class="o">:=</span> <span class="nf">Length</span><span class="p">(</span><span class="nx">head</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">reorderedList</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// The following loop will be executed n times</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// where n is the length of the linked list</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nf">Length</span><span class="p">(</span><span class="nx">reorderedList</span><span class="p">)</span><span class="o">!=</span><span class="nx">inputListLength</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Inserting a value at the end of a linked list will take O(n) time</span>
</span></span><span class="line"><span class="cl">        <span class="nx">reorderedList</span> <span class="p">=</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">reorderedList</span><span class="p">,</span> <span class="nx">forwardIter</span><span class="p">.</span><span class="nx">Val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Validating the length of a linked list will take O(n) time as well</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">Length</span><span class="p">(</span><span class="nx">reorderedList</span><span class="p">)</span><span class="o">==</span><span class="nx">inputListLength</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">            <span class="k">break</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// Time Complexity: O(n)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">reorderedList</span> <span class="p">=</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">reorderedList</span><span class="p">,</span> <span class="nx">reverseIter</span><span class="p">.</span><span class="nx">Val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Time Complexity: O(n)</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">Length</span><span class="p">(</span><span class="nx">reorderedList</span><span class="p">)</span><span class="o">==</span><span class="nx">inputListLength</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">            <span class="k">break</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="nx">forwardIter</span> <span class="p">=</span> <span class="nx">forwardIter</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">        <span class="nx">reverseIter</span> <span class="p">=</span> <span class="nx">reverseIter</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Copying the values of reorderedList to the input linked list</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">head</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">head</span><span class="p">.</span><span class="nx">Val</span> <span class="p">=</span> <span class="nx">reorderedList</span><span class="p">.</span><span class="nx">Val</span>
</span></span><span class="line"><span class="cl">        <span class="nx">head</span><span class="p">=</span><span class="nx">head</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">        <span class="nx">reorderedList</span><span class="p">=</span><span class="nx">reorderedList</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Input Linked List:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nf">Display</span><span class="p">(</span><span class="nx">ln</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">reorderList</span><span class="p">(</span><span class="nx">ln</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Reordered Linked List:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nf">Display</span><span class="p">(</span><span class="nx">ln</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Input Linked List:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1-&gt;2-&gt;3-&gt;4-&gt;5-&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Reordered Linked List:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1-&gt;5-&gt;2-&gt;4-&gt;3-&gt;</span>
</span></span></code></pre></div><h1 id="optimized-solution">Optimized Solution</h1>
<p>To solve this problem in linear time while also reducing the space complexity (by performing operations in-place) we
have to switch to the <a href="/posts/computer-science/interview-preparation/two-pointers-approach/#fast-slow-pointers" target="_blank">Fast-Slow Pointer Approach</a>.</p>
<p>We have to break the input linked list from the middle
(or the <code>middle.Next</code> node in the case of an odd number of nodes). Then we will insert the nodes from the second half of
the linked list in between the nodes of the first half. However, the second half of the linked list has to be reversed to
achieve the reordering format specified in the problem statement.</p>
<p>First, we will iterate over the input linked list using the <code>fast</code> and <code>slow</code> pointers.</p>
<p align="center"><img src="reorder-linked-lists-optimized1.png" alt="Optimized solution for the reorderList"></p>
<p>At the end of the iteration, the <code>fast</code> pointer will be at the end of the linked list and the <code>slow</code> pointer will be at
the middle node.</p>
<p>Then we will break the input linked list into two halves from the <code>slow.Next</code> node.</p>
<p align="center"><img src="reorder-linked-lists-optimized2.webp" alt="Optimized solution for the reorderList"></p>
<p>Since the reordering form requires the last node to be placed in between the first and second node of the list
we have to reverse the second half of the input linked list.</p>
<p align="center"><img src="reorder-linked-lists-optimized3.png" alt="Optimized solution for the reorderList"></p>
<p>Finally, we will iterate over the first half of the input linked list while also inserting the nodes from the second half
(reversed) in between.</p>
<p align="center"><img src="reorder-linked-lists-optimized4.webp" alt="Optimized solution for the reorderList"></p>
<h2 id="psuedo-code-for-the-optimized-solution">Psuedo code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">fast = linked_list.head
</span></span><span class="line"><span class="cl">slow = linked_list.head
</span></span><span class="line"><span class="cl">while(fast.next!=nil or fast!=nil){
</span></span><span class="line"><span class="cl">  fast = fast.next.next
</span></span><span class="line"><span class="cl">  slow = slow.next
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">temp = slow.next
</span></span><span class="line"><span class="cl">slow.next = nil
</span></span><span class="line"><span class="cl">slow = temp
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">reversed_half_list = reverse(slow)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">temp = linked_list.head
</span></span><span class="line"><span class="cl">reverse_temp = reversed_half_list.head
</span></span><span class="line"><span class="cl">while(temp!=nil){
</span></span><span class="line"><span class="cl">  temp2 = temp.next
</span></span><span class="line"><span class="cl">  temp.next = reverse_temp
</span></span><span class="line"><span class="cl">  reverse_temp.next = temp2
</span></span><span class="line"><span class="cl">  temp = temp2
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">return linked_list.head
</span></span></code></pre></div><h2 id="time-complexity-analysis-1">Time Complexity Analysis</h2>
<h3 id="best-case-scenario-1">Best Case Scenario</h3>
<p>The time complexity of iterating over the input linked list using <code>fast</code> and <code>slow</code> pointers will be $O(n/2)$
(where $n$ is the size of the linked list) because the <code>fast</code> pointer will skip over every other node.</p>
<p>Reversing the second half of the input linked list will also take $O(n/2)$ time.</p>
<p>Since we are iterating over only the first half of the linked list in the last loop its time complexity will also be $O(n/2)$.</p>
<p>So the total time complexity of the optimized solution in the best-case scenario is $O(3n/2)$ which could be
generalized to $O(n)$.</p>
<h3 id="worst-case-scenario-1">Worst Case Scenario</h3>
<p>All the steps in the optimized solution will be executed regardless of the characteristics of the input
linked list. So the time complexity for the worst-case scenario will also be $O(n)$.</p>
<h2 id="space-complexity-analysis-1">Space Complexity Analysis</h2>
<p>Since we are performing operations in place on the input linked list, no additional memory space is required
by the optimized solution. Thus, the total space complexity of the optimized solution is $O(1)$.</p>
<h2 id="code-for-optimized-solution">Code for Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">ListNode</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Val</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Next</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">Display</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">temp</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%d-&gt;&#34;</span><span class="p">,</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">Val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span> <span class="p">=</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">insertAtFront</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">,</span> <span class="nx">value</span> <span class="kt">int</span><span class="p">)(</span><span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">newNode</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span> <span class="nx">value</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">newNode</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">newNode</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">,</span> <span class="nx">value</span> <span class="kt">int</span><span class="p">)(</span><span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="nx">ln</span><span class="o">==</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">ln</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span> <span class="nx">value</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span><span class="p">(</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">            <span class="nx">temp</span><span class="p">=</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span> <span class="nx">value</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">reverseList</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">)(</span><span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">reverseList</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">temp</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">reverseList</span> <span class="p">=</span> <span class="nf">insertAtFront</span><span class="p">(</span><span class="nx">reverseList</span><span class="p">,</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">Val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span><span class="p">=</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">reverseList</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">reorderList</span><span class="p">(</span><span class="nx">head</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Iterating over the input linked list</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// using the fast and slow pointer</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Time Complexity: O(n/2) since the fast pointer </span>
</span></span><span class="line"><span class="cl">    <span class="c1">// will skip over every other node</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fast</span> <span class="o">:=</span> <span class="nx">head</span>
</span></span><span class="line"><span class="cl">    <span class="nx">slow</span> <span class="o">:=</span> <span class="nx">head</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">fast</span><span class="p">.</span><span class="nx">Next</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nx">fast</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// When the fast pointer finishes iteration </span>
</span></span><span class="line"><span class="cl">            <span class="c1">// the slow pointer will be at the middle node</span>
</span></span><span class="line"><span class="cl">            <span class="nx">fast</span> <span class="p">=</span> <span class="nx">fast</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">            <span class="nx">slow</span> <span class="p">=</span> <span class="nx">slow</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">break</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">    <span class="c1">// Breaking the input linked list </span>
</span></span><span class="line"><span class="cl">    <span class="c1">// after the middle node</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">slow</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">    <span class="nx">slow</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="kc">nil</span>
</span></span><span class="line"><span class="cl">    <span class="nx">slow</span> <span class="p">=</span> <span class="nx">temp</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Reversing the 2nd half of the linked list </span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Time Complexity: O(n/2), where n is the size </span>
</span></span><span class="line"><span class="cl">    <span class="c1">// of the input linked list</span>
</span></span><span class="line"><span class="cl">    <span class="nx">reversedSecond</span> <span class="o">:=</span> <span class="nf">reverseList</span><span class="p">(</span><span class="nx">slow</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Iterating over the 1st half of the linked list </span>
</span></span><span class="line"><span class="cl">    <span class="c1">// and inserting nodes from the reversed 2nd half</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Time Complexity: O(n/2)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span> <span class="p">=</span> <span class="nx">head</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">reversedSecond</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Storing next values of temp and reversedSecond </span>
</span></span><span class="line"><span class="cl">        <span class="c1">// in temporary variables</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp2</span> <span class="o">:=</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">        <span class="nx">tempReversedSlow</span> <span class="o">:=</span> <span class="nx">reversedSecond</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">        <span class="c1">// Reassigning Next nodes of temp and reversedSecond</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="nx">reversedSecond</span>
</span></span><span class="line"><span class="cl">        <span class="nx">reversedSecond</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="nx">temp2</span>
</span></span><span class="line"><span class="cl">   
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span> <span class="p">=</span> <span class="nx">temp2</span>
</span></span><span class="line"><span class="cl">        <span class="nx">reversedSecond</span> <span class="p">=</span> <span class="nx">tempReversedSlow</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Input Linked List:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nf">Display</span><span class="p">(</span><span class="nx">ln</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">reorderList</span><span class="p">(</span><span class="nx">ln</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Reordered Linked List:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nf">Display</span><span class="p">(</span><span class="nx">ln</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Input Linked List:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1-&gt;2-&gt;3-&gt;4-&gt;5-&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Reordered Linked List:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1-&gt;5-&gt;2-&gt;4-&gt;3-&gt;</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://leetcode.com/problems/reorder-list/description/" target="_blank">143. Reorder List</a><br>
<a href="https://www.youtube.com/watch?v=S5bfdUTrKLM" target="_blank">Linkedin Interview Question - Reorder List - Leetcode 143 - Python</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Merge Two Sorted Linked Lists</title>
      <link>http://www.avni.sh/posts/data-structures-and-algorithms/merge-sorted-linked-lists/</link>
      <pubDate>Mon, 29 Jan 2024 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/data-structures-and-algorithms/merge-sorted-linked-lists/</guid>
      <description>Implement a mergeTwoLists function that takes the head nodes of two sorted linked lists as the input and returns the head of the merged linked list</description>
      <content:encoded><![CDATA[<h1 id="problem-statement">Problem Statement</h1>
<p>We have to implement the <code>mergeTwoLists</code> function that takes the <code>head</code> nodes of two sorted linked lists as input
and returns the <code>head</code> node of the merged linked list as the output.</p>
<p align="center"><img src="merge-sorted-linked-lists-problem.png" alt="Problem statement for the mergeTwoLists"></p>
<h1 id="optimal-solution">Optimal Solution</h1>
<p>To merge both linked lists we can use the <a href="/posts/computer-science/interview-preparation/two-pointers-approach/" target="_blank">two-pointer approach</a> by maintaining an iterator on both linked lists and
comparing their values. The smaller value will be selected and <a href="/posts/computer-science/interview-preparation/linked-lists/#inserting-an-element-at-the-end" target="_blank">inserted at the end of a new list</a>. The result would
be a merged sorted linked list.</p>
<p>If all the values from any one of the linked lists are added then the other linked list will be joined at the end of
the merged linked list.</p>
<p align="center"><img src="merge-sorted-linked-lists-optimal.webp" alt="Optimal Solution for the mergeTwoLists"></p>
<h2 id="psuedo-code-for-the-optimal-solution">Psuedo-code for the Optimal Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">if(linked_list2==nil){
</span></span><span class="line"><span class="cl">  return linked_list1
</span></span><span class="line"><span class="cl">} else if(linked_list1==nil){
</span></span><span class="line"><span class="cl">  return linked_list2
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">temp1 = linked_list1.head
</span></span><span class="line"><span class="cl">temp2 = linked_list2.head
</span></span><span class="line"><span class="cl">mergedLinkedList = LinkedList()
</span></span><span class="line"><span class="cl">while(temp1!=nil and temp2!=nil){
</span></span><span class="line"><span class="cl"> if (temp1.value &lt; temp2.value){
</span></span><span class="line"><span class="cl">  mergedLinkedList.insertAtEnd(temp1.value)  
</span></span><span class="line"><span class="cl">  temp1=temp1.next
</span></span><span class="line"><span class="cl"> } else {
</span></span><span class="line"><span class="cl">  mergedLinkedList.insertAtEnd(temp2.value) 
</span></span><span class="line"><span class="cl">  temp2=temp2.next
</span></span><span class="line"><span class="cl"> } 
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">if(temp1!=nil){
</span></span><span class="line"><span class="cl">  mergedLinkedList.Add(temp1)
</span></span><span class="line"><span class="cl">} else if(temp2!=nil){
</span></span><span class="line"><span class="cl">  mergedLinkedList.Add(temp2)
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">return mergedLinkedList
</span></span></code></pre></div><h2 id="time-complexity-analysis">Time Complexity Analysis</h2>
<h3 id="best-case-scenario">Best Case Scenario</h3>
<p>For the best case input i.e. either the first or second linked list is empty, the time complexity of the
solution is $O(1)$ because we are returning the non-empty linked list as the result.</p>
<h3 id="worst-case-scenario">Worst Case Scenario</h3>
<p>In the worst-case scenario, we have to iterate over both the linked lists completely.
But since we are iterating them together using two pointers the time complexity will be determined by the length of
the larger linked list.</p>
<p>So the total time complexity of the solution in the worst-case scenario will be $O(n)$ where $n$ is the size
of the larger linked list.</p>
<h2 id="space-complexity-analysis">Space Complexity Analysis</h2>
<p>The merged linked list will contain all the elements from both input lists (with repetition). If the length of both linked
lists is $m$ and $n$, the additional memory space required by the solution will be $O(m+n)$.</p>
<h2 id="code-for-the-optimal-solution">Code for the Optimal Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">ListNode</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Val</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Next</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">Display</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">temp</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%d-&gt;&#34;</span><span class="p">,</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">Val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span><span class="p">=</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">InsertAtEnd</span><span class="p">(</span><span class="nx">list</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">,</span> <span class="nx">value</span> <span class="kt">int</span><span class="p">)(</span><span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nx">list</span><span class="o">==</span><span class="kc">nil</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">list</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span><span class="nx">value</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">list</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span><span class="p">(</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">            <span class="nx">temp</span><span class="p">=</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span><span class="nx">value</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">list</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">JoinLists</span><span class="p">(</span><span class="nx">list1</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">,</span> <span class="nx">list2</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">)(</span><span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Joins list1 with list2 by the last node</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">list1</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span><span class="p">=</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="nx">list2</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">list1</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">mergeTwoLists</span><span class="p">(</span><span class="nx">list1</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">,</span> <span class="nx">list2</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">)(</span><span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Checking if any of the input lists are empty</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="nx">list1</span><span class="o">==</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="nx">list2</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nx">list2</span><span class="o">==</span><span class="kc">nil</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="nx">list1</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">temp1</span> <span class="o">:=</span> <span class="nx">list1</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp2</span> <span class="o">:=</span> <span class="nx">list2</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">mergedList</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Loop over both linked lists until one of them/both</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// are empty</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">((</span><span class="nx">temp1</span><span class="o">!=</span><span class="kc">nil</span><span class="p">)</span><span class="o">&amp;&amp;</span><span class="p">(</span><span class="nx">temp2</span><span class="o">!=</span><span class="kc">nil</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// If the current value in the first list is smaller</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// then add it to the merged linked list and vice versa</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nx">temp1</span><span class="p">.</span><span class="nx">Val</span><span class="p">&lt;</span><span class="nx">temp2</span><span class="p">.</span><span class="nx">Val</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">            <span class="nx">mergedList</span> <span class="p">=</span> <span class="nf">InsertAtEnd</span><span class="p">(</span><span class="nx">mergedList</span><span class="p">,</span> <span class="nx">temp1</span><span class="p">.</span><span class="nx">Val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="nx">temp1</span><span class="p">=</span><span class="nx">temp1</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">mergedList</span> <span class="p">=</span> <span class="nf">InsertAtEnd</span><span class="p">(</span><span class="nx">mergedList</span><span class="p">,</span> <span class="nx">temp2</span><span class="p">.</span><span class="nx">Val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="nx">temp2</span><span class="p">=</span><span class="nx">temp2</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// If any one of the linked list is not empty</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// add it to the merged linked list</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="nx">temp1</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">mergedList</span> <span class="p">=</span> <span class="nf">JoinLists</span><span class="p">(</span><span class="nx">mergedList</span><span class="p">,</span> <span class="nx">temp1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nx">temp2</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">mergedList</span> <span class="p">=</span> <span class="nf">JoinLists</span><span class="p">(</span><span class="nx">mergedList</span><span class="p">,</span> <span class="nx">temp2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">mergedList</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">InsertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">InsertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">InsertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">InsertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">34</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="p">=</span> <span class="nf">InsertAtEnd</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="mi">42</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Input Linked List 1:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nf">Display</span><span class="p">(</span><span class="nx">ln</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">ln2</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln2</span> <span class="p">=</span> <span class="nf">InsertAtEnd</span><span class="p">(</span><span class="nx">ln2</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln2</span> <span class="p">=</span> <span class="nf">InsertAtEnd</span><span class="p">(</span><span class="nx">ln2</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln2</span> <span class="p">=</span> <span class="nf">InsertAtEnd</span><span class="p">(</span><span class="nx">ln2</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln2</span> <span class="p">=</span> <span class="nf">InsertAtEnd</span><span class="p">(</span><span class="nx">ln2</span><span class="p">,</span> <span class="mi">14</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln2</span> <span class="p">=</span> <span class="nf">InsertAtEnd</span><span class="p">(</span><span class="nx">ln2</span><span class="p">,</span> <span class="mi">66</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Input Linked List 2:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nf">Display</span><span class="p">(</span><span class="nx">ln2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Merged Linked List:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nf">Display</span><span class="p">(</span><span class="nf">mergeTwoLists</span><span class="p">(</span><span class="nx">ln</span><span class="p">,</span> <span class="nx">ln2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Input Linked List 1:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 5-&gt;7-&gt;20-&gt;34-&gt;42-&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Input Linked List 2:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2-&gt;4-&gt;6-&gt;14-&gt;66-&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Merged Linked List:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2-&gt;4-&gt;5-&gt;6-&gt;7-&gt;14-&gt;20-&gt;34-&gt;42-&gt;66-&gt;</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://leetcode.com/problems/merge-two-sorted-lists/description/" target="_blank">21. Merge Two Sorted Lists</a><br>
<a href="https://www.youtube.com/watch?v=XIdigk956u0" target="_blank">Merge Two Sorted Lists - Leetcode 21 - Python</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Reversing Linked Lists</title>
      <link>http://www.avni.sh/posts/data-structures-and-algorithms/reverse-linked-lists/</link>
      <pubDate>Fri, 26 Jan 2024 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/data-structures-and-algorithms/reverse-linked-lists/</guid>
      <description>Implement a reverseList function that takes the head of a linked list as the input and returns the head of the reversed linked list</description>
      <content:encoded><![CDATA[<h1 id="problem-statement">Problem Statement</h1>
<p>We have to implement the <code>reverseList</code> function that takes the <code>head</code> node of a linked list as an input
and returns the <code>head</code> node of the reversed linked list in the output.</p>
<p align="center"><img src="reverse-linked-lists-problem.png" alt="Problem statement for the reverseList"></p>
<h1 id="brute-force-solution">Brute Force Solution</h1>
<p>If we iterate over the input linked list and insert its <a href="/posts/computer-science/interview-preparation/linked-lists/#inserting-an-element-at-the-beginning" target="_blank">value at the beginning</a> of a new list the result would be a reversed linked list.</p>
<p align="center"><img src="reverse-linked-lists-brute-force.png" alt="Brute-force solution for the reverseList"></p>
<h2 id="psuedo-code-for-the-brute-force-solution">Psuedo-code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">reversedLinkedList = LinkedList()
</span></span><span class="line"><span class="cl">temp = linked_list.head
</span></span><span class="line"><span class="cl">while(temp!=nil){
</span></span><span class="line"><span class="cl">  reversedLinkedList.insertAtStart(temp.value)
</span></span><span class="line"><span class="cl">  temp = temp.next
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">return reversedLinkedList
</span></span></code></pre></div><h2 id="time-complexity-analysis">Time Complexity Analysis</h2>
<h3 id="best-case-scenario">Best Case Scenario</h3>
<p>In the best-case scenario, the time complexity of the brute force solution will be $O(n)$ as it requires a loop over
the input linked list.</p>
<h3 id="worst-case-scenario">Worst Case Scenario</h3>
<p>The time complexity worst-case scenario for the brute force solution is the same as the best-case scenario i.e. $O(n)$.</p>
<h2 id="space-complexity-analysis">Space Complexity Analysis</h2>
<p>The brute-force solution assumes that we have enough memory space to store the input linked list and the
reversed linked list in the memory at the same time. Thus, the space complexity of the brute force solution will
scale linearly ($O(2n)$) to the size of the input data.</p>
<h2 id="code-for-brute-force-solution">Code for Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">ListNode</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Val</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Next</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">Display</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">temp</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%d-&gt;&#34;</span><span class="p">,</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">Val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span><span class="p">=</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">insertAtStart</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">,</span> <span class="nx">value</span> <span class="kt">int</span><span class="p">)(</span><span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">tempNode</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span><span class="nx">value</span><span class="p">,</span> <span class="nx">Next</span><span class="p">:</span><span class="nx">ln</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">tempNode</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">reverseList</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">)(</span><span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Creating a new linked list to store nodes in </span>
</span></span><span class="line"><span class="cl">    <span class="c1">// the reverse order</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">reversedList</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">temp</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Inserting values at the start of the reversed</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// linked list</span>
</span></span><span class="line"><span class="cl">        <span class="nx">reversedList</span> <span class="p">=</span> <span class="nf">insertAtStart</span><span class="p">(</span><span class="nx">reversedList</span><span class="p">,</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">Val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span><span class="p">=</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">reversedList</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span><span class="mi">5</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span><span class="mi">2</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span><span class="mi">3</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span><span class="mi">7</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span><span class="mi">4</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Input Linked List:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nf">Display</span><span class="p">(</span><span class="nx">ln</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Reversed Linked List:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nf">Display</span><span class="p">(</span><span class="nf">reverseList</span><span class="p">(</span><span class="nx">ln</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Input Linked List:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 5-&gt;2-&gt;3-&gt;7-&gt;4-&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Reversed Linked List:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 4-&gt;7-&gt;3-&gt;2-&gt;5-&gt;</span>
</span></span></code></pre></div><h1 id="optimized-solution">Optimized Solution</h1>
<p>Since reversing a linked list will require traversal of all the nodes, the time complexity of the solution
could not be improved from $O(n)$. But if we could reverse the <code>next</code> node reference in place for each
node the space complexity would be reduced to $O(n)$.</p>
<p>We will use the <a href="/posts/computer-science/interview-preparation/two-pointers-approach/" target="_blank">two-pointer approach</a> to maintain references to nodes <code>current</code> and <code>previous</code>. The
<code>current</code> pointer will start from the <code>head</code> node and iterate till the <code>nil</code> at the end. Whereas, the
<code>previous</code> pointer will be one step behind the <code>current</code>.</p>
<p align="center"><img src="reverse-linked-lists-optimized.png" alt="Optimized solution for the reverseList"></p>
<p>At the end of the iteration, the <code>previous</code> pointer will be pointing to the head of the reversed linked list.</p>
<h2 id="psuedo-code-for-the-optimized-solution">Psuedo code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">previous = none
</span></span><span class="line"><span class="cl">current = head
</span></span><span class="line"><span class="cl">while(current!=none){
</span></span><span class="line"><span class="cl">  temp = current.next
</span></span><span class="line"><span class="cl">  current.next = previous
</span></span><span class="line"><span class="cl">  previous = current
</span></span><span class="line"><span class="cl">  current = temp
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">return previous
</span></span></code></pre></div><h2 id="time-complexity-analysis-1">Time Complexity Analysis</h2>
<h3 id="best-case-scenario-1">Best Case Scenario</h3>
<p>We are iterating over the complete linked list so the time complexity is the same as the brute force solution i.e. $O(n)$.</p>
<h3 id="worst-case-scenario-1">Worst Case Scenario</h3>
<p>The time complexity of the optimized solution for the worst-case scenario will also be $O(n)$.</p>
<h2 id="space-complexity-analysis-1">Space Complexity Analysis</h2>
<p>Unlike brute-force solution we are performing operations on the input linked list directly so we don&rsquo;t
need additional memory space and the space complexity will be $O(1)$.</p>
<h2 id="code-for-optimized-solution">Code for Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">ListNode</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Val</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Next</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">Display</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">temp</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%d-&gt;&#34;</span><span class="p">,</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">Val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span><span class="p">=</span><span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">reverseList</span><span class="p">(</span><span class="nx">ln</span> <span class="o">*</span><span class="nx">ListNode</span><span class="p">)(</span><span class="o">*</span><span class="nx">ListNode</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">prev</span> <span class="o">*</span><span class="nx">ListNode</span>
</span></span><span class="line"><span class="cl">    <span class="nx">curr</span> <span class="o">:=</span> <span class="nx">ln</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="nx">curr</span><span class="o">!=</span><span class="kc">nil</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Storing the location of the node </span>
</span></span><span class="line"><span class="cl">        <span class="c1">// next to the current pointer</span>
</span></span><span class="line"><span class="cl">        <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">curr</span><span class="p">.</span><span class="nx">Next</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Changing next for the current node to </span>
</span></span><span class="line"><span class="cl">        <span class="c1">// the node pointed by the previous pointer</span>
</span></span><span class="line"><span class="cl">        <span class="nx">curr</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="nx">prev</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Moving the previous pointer one node forward</span>
</span></span><span class="line"><span class="cl">        <span class="nx">prev</span> <span class="p">=</span> <span class="nx">curr</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Resetting current to the next node </span>
</span></span><span class="line"><span class="cl">        <span class="c1">// in iteration</span>
</span></span><span class="line"><span class="cl">        <span class="nx">curr</span> <span class="p">=</span> <span class="nx">temp</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">prev</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span><span class="mi">5</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span><span class="mi">2</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span><span class="mi">3</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span><span class="mi">7</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ln</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">ListNode</span><span class="p">{</span><span class="nx">Val</span><span class="p">:</span><span class="mi">4</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Input Linked List:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nf">Display</span><span class="p">(</span><span class="nx">ln</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Reversed Linked List:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nf">Display</span><span class="p">(</span><span class="nf">reverseList</span><span class="p">(</span><span class="nx">ln</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://leetcode.com/problems/reverse-linked-list/description/" target="_blank">206. Reverse Linked List</a><br>
<a href="https://www.youtube.com/watch?v=G0_I-ZF0S38" target="_blank">Reverse Linked List - Iterative AND Recursive - Leetcode 206 - Python</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Finding the Longest Consecutive Sequence in an Array</title>
      <link>http://www.avni.sh/posts/data-structures-and-algorithms/longest-consecutive/</link>
      <pubDate>Thu, 09 Nov 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/data-structures-and-algorithms/longest-consecutive/</guid>
      <description>Implement a longestConsecutive function that returns the length of the longest sequence of consecutive numbers in an array</description>
      <content:encoded><![CDATA[<h1 id="problem-statement">Problem Statement</h1>
<p>We have to implement the <code>longestConsecutive</code> function that takes an integer array as input and returns the length of the longest sequence of consecutive integers.</p>
<p align="center"><img src="longest-consecutive-problem.png" alt="Problem statement for the longestConsecutive"></p>
<p>For example, in array <code>[4, 2, 7, 8, 1, 5, 6, 0]</code> we have two sequences of consecutive integers: <code>[0, 1, 2]</code> and <code>[4, 5, 6, 7, 8]</code>. The longest sequence (<code>[4, 5, 6, 7, 8]</code>) has length 5.</p>
<h1 id="brute-force-solution">Brute Force Solution</h1>
<p>It would be easier to find consecutive sequences if the input array is sorted.</p>
<p align="center"><img src="longest-consecutive-brute-force.png" alt="Brute-force solution for the longestConsecutive"></p>
<p>Once we have the sorted array we can iterate over it and find the longest sequence.</p>
<h2 id="psuedo-code-for-the-brute-force-solution">Psuedo-code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">sortedInputArray = sort(inputArray)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">longest_sequence_length = 0
</span></span><span class="line"><span class="cl">sequence_length = 1
</span></span><span class="line"><span class="cl">loop index in from 1 to len(sortedInputArray)
</span></span><span class="line"><span class="cl">  if sortedInputArray[index] - sortedInputArray[index-1]==1:
</span></span><span class="line"><span class="cl">    sequence_length += 1
</span></span><span class="line"><span class="cl">  else if sortedInputArray[index]==sortedInputArray[index-1]:
</span></span><span class="line"><span class="cl">    pass
</span></span><span class="line"><span class="cl">  else
</span></span><span class="line"><span class="cl">    sequence_length = 1
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">  longest_sequence_length = max(longest_sequence_length, sequence_length) 
</span></span></code></pre></div><h2 id="time-complexity-analysis">Time Complexity Analysis</h2>
<h3 id="best-case-scenario">Best Case Scenario</h3>
<p>For the best-case input, the brute-force solution will return the result in $O(n) + O(n \log(n))$ time. Since the time complexity of the best sorting algorithm will be $O(n \log(n))$ and the time complexity of iterating over the array is $O(n)$. We can simplify the total time complexity of the brute-force solution to $O(n \log(n))$.</p>
<h3 id="worst-case-scenario">Worst Case Scenario</h3>
<p>In the worst-case scenario, the time complexity of the brute-force solution will be the same i.e. $O(n \log(n))$.</p>
<h2 id="space-complexity-analysis">Space Complexity Analysis</h2>
<p>We are assuming that the sorting operation is done in place for the elements in the input array. Thus, the space complexity of brute-force solution is constant i.e. $O(1)$.</p>
<h2 id="code-for-brute-force-solution">Code for Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;sort&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;math&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">longestConsecutive</span><span class="p">(</span><span class="nx">nums</span> <span class="p">[]</span><span class="kt">int</span><span class="p">)(</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// For an empty input array the length of</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// longest consecutive sequence will be 0</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// The best sorting algorithm will sort in</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// O(nlog(n)) time</span>
</span></span><span class="line"><span class="cl">    <span class="nx">sort</span><span class="p">.</span><span class="nf">Ints</span><span class="p">(</span><span class="nx">nums</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// This variable will contain the length</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// of longest consecutive sequence</span>
</span></span><span class="line"><span class="cl">    <span class="nx">longestSequenceLength</span> <span class="o">:=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Temporary variable to store the length</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// of the current sequence</span>
</span></span><span class="line"><span class="cl">    <span class="nx">sequenceLength</span> <span class="o">:=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">1</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">((</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="o">-</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span><span class="o">==</span><span class="mi">1</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            <span class="c1">// If the values at index and index-1</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// are consecutive then increment the current</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// sequence length by 1</span>
</span></span><span class="line"><span class="cl">            <span class="nx">sequenceLength</span><span class="o">+=</span><span class="mi">1</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="o">==</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="o">-</span><span class="mi">1</span><span class="p">]){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// If the values at index and index-1</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// are the same then don&#39;t increment the current</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// sequence length</span>
</span></span><span class="line"><span class="cl">            <span class="nx">sequenceLength</span><span class="o">+=</span><span class="mi">0</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            <span class="c1">// If the consecutive sequence is broken</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// then reset the current sequence length to 1</span>
</span></span><span class="line"><span class="cl">            <span class="nx">sequenceLength</span><span class="p">=</span><span class="mi">1</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// On every iteration check if the length</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// of the current sequence is greater than</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// the value stored in longestSequenceLength</span>
</span></span><span class="line"><span class="cl">        <span class="nx">longestSequenceLength</span> <span class="p">=</span> <span class="nb">int</span><span class="p">(</span><span class="nx">math</span><span class="p">.</span><span class="nf">Max</span><span class="p">(</span><span class="nb">float64</span><span class="p">(</span><span class="nx">sequenceLength</span><span class="p">),</span> 
</span></span><span class="line"><span class="cl">                                <span class="nb">float64</span><span class="p">(</span><span class="nx">longestSequenceLength</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">longestSequenceLength</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">inputArray</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">100</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Length of Longest Consecutive Sequence:&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">longestConsecutive</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">                
</span></span><span class="line"><span class="cl">    <span class="nx">inputArray</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">0</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Length of Longest Consecutive Sequence:&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">longestConsecutive</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Length of Longest Consecutive Sequence: 4</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Length of Longest Consecutive Sequence: 5</span>
</span></span></code></pre></div><h1 id="optimized-solution">Optimized Solution</h1>
<p>In terms of time complexity of the brute-force solution sorting is the most expensive operation ($O(n \log(n))$). We can eliminate it if we create a hashmap of elements in the array.</p>
<p align="center"><img src="longest-consecutive-optimized1.png" alt="Optimized solution for the longestConsecutive"></p>
<p>If the <code>value</code> is the first element in a consecutive sequence, it implies that <code>value-1</code> does not exist in the <code>inputArray</code>. So we can iterate over all the elements in <code>inputArray</code> and identify the first elements of consecutive sequences by searching for <code>inputArray[index]-1</code> in the hashmap.</p>
<p align="center"><img src="longest-consecutive-optimized2.png" alt="Optimized solution for the longestConsecutive"></p>
<p>Once we have found the first element of consecutive sequence we can keep looking for the next value in the hashmap until the sequence is broken.</p>
<p align="center"><img src="longest-consecutive-optimized3.png" alt="Optimized solution for the longestConsecutive"></p>
<p>During the second iteration we can utilize the hashmap to avoid duplicate values in the input array.</p>
<h2 id="psuedo-code-for-the-optimized-solution">Psuedo code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">hashmap = HashMap()
</span></span><span class="line"><span class="cl">loop value in inputArray
</span></span><span class="line"><span class="cl">	if not hashmap[value]
</span></span><span class="line"><span class="cl">		hashmap[value] = 1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">longest_sequence = 0
</span></span><span class="line"><span class="cl">sequence = 0
</span></span><span class="line"><span class="cl">loop key in hashmap.keys()
</span></span><span class="line"><span class="cl">	if not hashmap[key-1]
</span></span><span class="line"><span class="cl">		while hashmap[key+1]
</span></span><span class="line"><span class="cl">			sequence += 1
</span></span><span class="line"><span class="cl">			value+=1
</span></span><span class="line"><span class="cl">	else
</span></span><span class="line"><span class="cl">		sequence = 1
</span></span><span class="line"><span class="cl">	longest_sequence = max(sequence, longest_sequence)
</span></span></code></pre></div><h2 id="time-complexity-analysis-1">Time Complexity Analysis</h2>
<h3 id="best-case-scenario-1">Best Case Scenario</h3>
<p>The loop executed to fill the hashmap has a fixed time complexity of $O(n)$.</p>
<p>If the input for the optimized solution contains only the sequences of length <code>1</code> then the nested <code>while</code> loop will not be executed. Thus, the total time complexity of the optimized solution in the best-case scenario will be $O(n) + O(n)$ or simply $O(n)$.</p>
<h3 id="worst-case-scenario-1">Worst Case Scenario</h3>
<p>The check for <code>hashmap[value-1]</code> ensures that we are only looking for consecutive numbers upon encountering the first value. Thus, the total complexity of the worst-case scenario is also $O(n)$.</p>
<h2 id="space-complexity-analysis-1">Space Complexity Analysis</h2>
<p>The space complexity of the optimized solution is worse than the brute-force solution because it takes extra $O(n)$ space to store the hashmap.</p>
<h2 id="code-for-optimized-solution">Code for Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">longestConsecutive</span><span class="p">(</span><span class="nx">nums</span> <span class="p">[]</span><span class="kt">int</span><span class="p">)(</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Return 0 for the empty nums array</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Create a hashmap of all values in the nums array</span>
</span></span><span class="line"><span class="cl">    <span class="nx">hashmap</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">hashmap</span><span class="p">[</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">!</span><span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">hashmap</span><span class="p">[</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]]</span> <span class="p">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">maxSeqLen</span> <span class="o">:=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">hashmap</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">seqLen</span> <span class="o">:=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// If value-1 does not exist in the hashmap</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// it is the start of a sequence</span>
</span></span><span class="line"><span class="cl">        <span class="nx">_</span><span class="p">,</span> <span class="nx">found</span> <span class="o">:=</span> <span class="nx">hashmap</span><span class="p">[</span><span class="nx">value</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">!</span><span class="nx">found</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">// Increment the value and sequence length</span>
</span></span><span class="line"><span class="cl">                <span class="c1">// until we can&#39;t find value+1 in the hashmap</span>
</span></span><span class="line"><span class="cl">                <span class="nx">value</span><span class="o">++</span>
</span></span><span class="line"><span class="cl">                <span class="nx">_</span><span class="p">,</span> <span class="nx">found</span> <span class="p">=</span> <span class="nx">hashmap</span><span class="p">[</span><span class="nx">value</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="nx">found</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">seqLen</span><span class="o">++</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="k">break</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Reset the value of longestSequence to the maximum</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// of current sequence and the current value of </span>
</span></span><span class="line"><span class="cl">        <span class="c1">// the longestSequence</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nx">seqLen</span> <span class="p">&gt;</span> <span class="nx">maxSeqLen</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">maxSeqLen</span> <span class="p">=</span> <span class="nx">seqLen</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">maxSeqLen</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">inputArray</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">100</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Length of Longest Consecutive Sequence:&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">longestConsecutive</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">                
</span></span><span class="line"><span class="cl">    <span class="nx">inputArray</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">0</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Length of Longest Consecutive Sequence:&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">longestConsecutive</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Length of Longest Consecutive Sequence: 4</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Length of Longest Consecutive Sequence: 5</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://leetcode.com/problems/longest-consecutive-sequence/description/" target="_blank">128. Longest Consecutive Sequence</a><br>
<a href="https://youtu.be/P6RZZMu_maU?si=WNGUGem6fZQfm7yj" target="_blank">Leetcode 128 - LONGEST CONSECUTIVE SEQUENCE</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Encoding and Decoding Functions for Strings</title>
      <link>http://www.avni.sh/posts/data-structures-and-algorithms/encoding-and-decoding-strings/</link>
      <pubDate>Mon, 06 Nov 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/data-structures-and-algorithms/encoding-and-decoding-strings/</guid>
      <description>Implement an encode function to encode a list of string values to be transmitted over a network. Also, implement a decode function to convert the encoded string back to its original value.</description>
      <content:encoded><![CDATA[<h1 id="problem-statement">Problem Statement</h1>
<p>We have to implement an <code>encode</code> function that takes a list of string values as input and returns a single encoded string that could be transmitted over a network. On the other side of the network, the <code>decode</code> function will take the encoded string as input and return the original list of string values as output.</p>
<p align="center"><img src="encoding-and-decoding-strings-problem.png" alt="Problem statement for encoding and decoding strings"></p>
<p>A delimiter could be used to differentiate between words. For example, <code>[&quot;Hello&quot;, &quot;World&quot;]</code> could be encoded with comma delimiter (<code>,</code>) to <code>&quot;Hello,World&quot;</code>.</p>
<h1 id="brute-force-solution">Brute Force Solution</h1>
<p>In the brute-force approach to solving this problem, we can execute a loop over the input list appending each string with some special character as a delimiter.</p>
<p align="center"><img src="encoding-and-decoding-strings-brute-force.png" alt="Brute-force solution for encoding and decoding strings"></p>
<p>If the special character is a part of the string itself (for example <code>&quot;Hello,&quot;</code>) then we can add an escape character before it, such that it is easier to differentiate from the delimiter during decoding.</p>
<h2 id="psuedo-code-for-the-brute-force-solution">Psuedo-code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">func encode(array)
</span></span><span class="line"><span class="cl">  delimiter = &#34;,&#34;
</span></span><span class="line"><span class="cl">  encodedString = &#34;&#34;
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">  loop index on array
</span></span><span class="line"><span class="cl">    string = array[index]
</span></span><span class="line"><span class="cl">    new_string = &#34;&#34;
</span></span><span class="line"><span class="cl">		
</span></span><span class="line"><span class="cl">    loop index2 on string
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      if string[index2] is delimiter or &#34;\&#34;
</span></span><span class="line"><span class="cl">        new_string.append(&#34;\&#34;)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      new_string.append(string[index2])
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    if encodedString is not empty
</span></span><span class="line"><span class="cl">      encodedString.append(delimiter)
</span></span><span class="line"><span class="cl">			
</span></span><span class="line"><span class="cl">    encodedString.append(new_string)
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">  return encodedString
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">func decode(encodedString)
</span></span><span class="line"><span class="cl">  delimiter=&#34;,&#34;
</span></span><span class="line"><span class="cl">  decodedList = []
</span></span><span class="line"><span class="cl">  string = &#34;&#34;
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">  loop index on encodedString
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    if encodedString[index] is &#34;\&#34;
</span></span><span class="line"><span class="cl">      string.append(encodedString[index+1])
</span></span><span class="line"><span class="cl">      index++
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    else if encodedString[index] is delimiter
</span></span><span class="line"><span class="cl">      decodedList.append(string)
</span></span><span class="line"><span class="cl">      string = &#34;&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    else
</span></span><span class="line"><span class="cl">      string.append(encodedString[index])
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  decodedList.append(string)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  return decodedList
</span></span></code></pre></div><h2 id="time-complexity-analysis">Time Complexity Analysis</h2>
<h3 id="best-case-scenario">Best Case Scenario</h3>
<p>The best-case input for the brute force solution would be a string full of delimiters since the decoding process will finish earlier (the <code>index</code> is incremented by 2 while encountering the escape character <code>\</code>).</p>
<p>The time complexity of encoding and decoding in the best-case scenario would be $O(k \times n)$ where $k$ is the average size of the string and $n$ is the size of the input array.</p>
<h3 id="worst-case-scenario">Worst Case Scenario</h3>
<p>For the worst-case time complexity of the brute-force solution, the input should not contain the delimiter or escape characters. The time complexity of encoding and decoding would still be $O(k \times n)$.</p>
<h2 id="space-complexity-analysis">Space Complexity Analysis</h2>
<p>The additional space required to store the <code>encodedString</code> and <code>decodedList</code> will be $O(kn)$.</p>
<h2 id="code-for-the-brute-force-solution">Code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">encode</span><span class="p">(</span><span class="nx">inputArray</span> <span class="p">[]</span><span class="kt">string</span><span class="p">)(</span><span class="kt">string</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">delimiter</span> <span class="o">:=</span> <span class="s">&#34;,&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">encodedString</span> <span class="o">:=</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">str</span> <span class="o">:=</span> <span class="nb">string</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">[</span><span class="nx">index</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">        <span class="nx">updatedStr</span> <span class="o">:=</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">index2</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index2</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">str</span><span class="p">);</span><span class="nx">index2</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">char</span> <span class="o">:=</span> <span class="nb">string</span><span class="p">(</span><span class="nx">str</span><span class="p">[</span><span class="nx">index2</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// If the delimiter or &#34;\&#34; is within the string</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// add an extra escape character (\))</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="nx">char</span><span class="o">==</span><span class="nx">delimiter</span> <span class="o">||</span> <span class="nx">char</span><span class="o">==</span><span class="s">&#34;\\&#34;</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">updatedStr</span> <span class="o">+=</span> <span class="s">&#34;\\&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="nx">updatedStr</span> <span class="o">+=</span> <span class="nx">char</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">)</span><span class="o">!=</span><span class="mi">0</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">encodedString</span> <span class="o">+=</span> <span class="nx">delimiter</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="nx">encodedString</span> <span class="o">+=</span> <span class="nx">updatedStr</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">encodedString</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">decode</span><span class="p">(</span><span class="nx">encodedString</span> <span class="kt">string</span><span class="p">)([]</span><span class="kt">string</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">delimiter</span> <span class="o">:=</span> <span class="s">&#34;,&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">decodedList</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">str</span> <span class="o">:=</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">char</span> <span class="o">:=</span> <span class="nb">string</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">[</span><span class="nx">index</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nx">char</span> <span class="o">==</span> <span class="s">&#34;\\&#34;</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// If we encounter an escape character in the encoded string</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// Add the next character to the string</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// and increment the index by 1</span>
</span></span><span class="line"><span class="cl">            <span class="nx">str</span> <span class="o">+=</span> <span class="nb">string</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">[</span><span class="nx">index</span><span class="o">+</span><span class="mi">1</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">            <span class="nx">index</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="nx">char</span><span class="o">==</span><span class="nx">delimiter</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// If we encounter the delimiter</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// Add the current string to decodedList</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// and reset its values</span>
</span></span><span class="line"><span class="cl">            <span class="nx">decodedList</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">decodedList</span><span class="p">,</span> <span class="nx">str</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="nx">str</span> <span class="p">=</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// Add the string to decodedList</span>
</span></span><span class="line"><span class="cl">            <span class="nx">str</span> <span class="o">+=</span> <span class="nx">char</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">decodedList</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">decodedList</span><span class="p">,</span> <span class="nx">str</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">decodedList</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">inputArray</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Hello&#34;</span><span class="p">,</span> <span class="s">&#34;World&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">encodedString</span> <span class="o">:=</span> <span class="nf">encode</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Input Array&#34;</span><span class="p">,</span> <span class="nx">inputArray</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Encoded String:&#34;</span><span class="p">,</span> <span class="nx">encodedString</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Decoded String:&#34;</span><span class="p">,</span> <span class="nf">decode</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">inputArray</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Hel,lo&#34;</span><span class="p">,</span> <span class="s">&#34;World&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">encodedString</span> <span class="p">=</span> <span class="nf">encode</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Input Array&#34;</span><span class="p">,</span> <span class="nx">inputArray</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Encoded String:&#34;</span><span class="p">,</span> <span class="nx">encodedString</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Decoded String:&#34;</span><span class="p">,</span> <span class="nf">decode</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">inputArray</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Hel\\,\\lo&#34;</span><span class="p">,</span> <span class="s">&#34;World&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">encodedString</span> <span class="p">=</span> <span class="nf">encode</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Input Array&#34;</span><span class="p">,</span> <span class="nx">inputArray</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Encoded String:&#34;</span><span class="p">,</span> <span class="nx">encodedString</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Decoded String:&#34;</span><span class="p">,</span> <span class="nf">decode</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Input Array [Hello World]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Encoded String: Hello,World</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Decoded String: [Hello World]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Input Array [Hel,lo World]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Encoded String: Hel\,lo,World</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Decoded String: [Hel,lo World]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Input Array [Hel\,\lo World]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Encoded String: Hel\\\,\\lo,World</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Decoded String: [Hel\,\lo World]</span>
</span></span></code></pre></div><h1 id="optimized-solution">Optimized Solution</h1>
<p>We can improve the time complexity of the brute-force solution if we can somehow omit the loop over each string.</p>
<p>If the length of the string could be used as a delimiter then we can avoid iteration over individual strings because the length function <code>len(string)</code> has $O(1)$ time complexity. But, this presents two more challenges</p>
<ul>
<li>if the length of a string is greater than 9 (double digits)</li>
<li>if the string contains numbers, they could be confused with the length of the strings</li>
</ul>
<p align="center"><img src="encoding-and-decoding-strings-optimized.png" alt="Optimized Solution for encoding and decoding strings"></p>
<p>To improve on this we can use a special character with the length of the string as delimiters, for example, <code>[&quot;Hello&quot;, &quot;World&quot;]</code> could be encoded to <code>5;Hello5;World</code>.</p>
<h2 id="psuedo-code-for-the-optimized-solution">Psuedo code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">func encode(array)
</span></span><span class="line"><span class="cl">  delimiter = &#34;,&#34;
</span></span><span class="line"><span class="cl">  encodedString = &#34;&#34;
</span></span><span class="line"><span class="cl">  loop each element in array
</span></span><span class="line"><span class="cl">    encodedString.append(len(element), delimiter, element)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  return encodedString
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">func decode(encodedString)
</span></span><span class="line"><span class="cl">  delimiter = &#34;,&#34;
</span></span><span class="line"><span class="cl">  decodedList = []
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  index = 0
</span></span><span class="line"><span class="cl">  while index&lt;len(encodedString)
</span></span><span class="line"><span class="cl">    index2 = index
</span></span><span class="line"><span class="cl">    while encodedString[index2] is not delimiter
</span></span><span class="line"><span class="cl">      index2++
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    stringLen = toInt(encodedString[index:index2])
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    string_start = index2+1
</span></span><span class="line"><span class="cl">    string_end = index2+stringLen+1
</span></span><span class="line"><span class="cl">    string = encodedString[string_start:string_end]
</span></span><span class="line"><span class="cl">    decodedList.append(string)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    index += string_end
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  return decodedList
</span></span></code></pre></div><h2 id="time-complexity-analysis-1">Time Complexity Analysis</h2>
<h3 id="best-case-scenario-1">Best Case Scenario</h3>
<p>The best-case input for the optimized solution will contain strings with length &lt; 9.</p>
<p>The time complexity of the encoding loop will be $O(n)$ because it will iterate over all the elements in the array.</p>
<p>For the decoding loop, the time complexity appears to be $O(kn)$ but we are incrementing the <code>index</code> by the length of string value ($k$) on every iteration. Thus, the time complexity of decoding is also $O({kn \over k}) = O(n)$.</p>
<h3 id="worst-case-scenario-1">Worst Case Scenario</h3>
<p>The worst-case time complexity of encoding is the same as the best-case i.e. $O(n)$.</p>
<p>The time complexity of the decoding function will depend on the number of digits (in the length of the largest string). For example: If the length of the largest individual string is <code>199990</code> then the time complexity of decoding the string will be $O(6 \times n)$ (because <code>199990</code> has 6 digits).</p>
<h2 id="space-complexity-analysis-1">Space Complexity Analysis</h2>
<p>The space complexity of the optimized solution will be the same as the brute force solution ($O(kn)$) as no additional data structures are used.</p>
<h2 id="code-for-the-optimized-solution">Code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;strconv&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">encode</span><span class="p">(</span><span class="nx">inputArray</span> <span class="p">[]</span><span class="kt">string</span><span class="p">)(</span><span class="kt">string</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">encodedString</span> <span class="o">:=</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// For each string append</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// the string length</span>
</span></span><span class="line"><span class="cl">        <span class="nx">encodedString</span> <span class="o">+=</span> <span class="nx">strconv</span><span class="p">.</span><span class="nf">Itoa</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">[</span><span class="nx">index</span><span class="p">]))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// &#34;#&#34; delimiter</span>
</span></span><span class="line"><span class="cl">        <span class="nx">encodedString</span> <span class="o">+=</span> <span class="s">&#34;#&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// the string itself</span>
</span></span><span class="line"><span class="cl">        <span class="nx">encodedString</span> <span class="o">+=</span> <span class="nx">inputArray</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">encodedString</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">decode</span><span class="p">(</span><span class="nx">encodedString</span> <span class="kt">string</span><span class="p">)([]</span><span class="kt">string</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">decodedList</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">index</span> <span class="o">:=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">);{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">index2</span><span class="o">:=</span><span class="nx">index</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="p">;</span><span class="nb">string</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">[</span><span class="nx">index2</span><span class="p">])</span><span class="o">!=</span><span class="s">&#34;#&#34;</span><span class="p">;{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// Exit loop upon encountering the delimiter</span>
</span></span><span class="line"><span class="cl">            <span class="nx">index2</span><span class="o">+=</span><span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// The length of individual string would be parsed</span>
</span></span><span class="line"><span class="cl">        <span class="nx">lenString</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">strconv</span><span class="p">.</span><span class="nf">Atoi</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">[</span><span class="nx">index</span><span class="p">:</span><span class="nx">index2</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Extract the string from the encodedString</span>
</span></span><span class="line"><span class="cl">        <span class="nx">str</span> <span class="o">:=</span> <span class="nb">string</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">[</span><span class="nx">index2</span><span class="o">+</span><span class="mi">1</span><span class="p">:</span><span class="nx">index2</span><span class="o">+</span><span class="nx">lenString</span><span class="o">+</span><span class="mi">1</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Append the string to decodedList </span>
</span></span><span class="line"><span class="cl">        <span class="nx">decodedList</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">decodedList</span><span class="p">,</span> <span class="nx">str</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Increment index, moving it to the next string length</span>
</span></span><span class="line"><span class="cl">        <span class="nx">index</span> <span class="o">+=</span> <span class="nx">index2</span><span class="o">+</span><span class="nx">lenString</span><span class="o">+</span><span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">decodedList</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">inputArray</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Hello&#34;</span><span class="p">,</span> <span class="s">&#34;World&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">encodedString</span> <span class="o">:=</span> <span class="nf">encode</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Input Array&#34;</span><span class="p">,</span> <span class="nx">inputArray</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Encoded String:&#34;</span><span class="p">,</span> <span class="nx">encodedString</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Decoded String:&#34;</span><span class="p">,</span> <span class="nf">decode</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">inputArray</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Hel,lo&#34;</span><span class="p">,</span> <span class="s">&#34;World&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">encodedString</span> <span class="p">=</span> <span class="nf">encode</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Input Array&#34;</span><span class="p">,</span> <span class="nx">inputArray</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Encoded String:&#34;</span><span class="p">,</span> <span class="nx">encodedString</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Decoded String:&#34;</span><span class="p">,</span> <span class="nf">decode</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">inputArray</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Hel\\,\\lo&#34;</span><span class="p">,</span> <span class="s">&#34;World&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">encodedString</span> <span class="p">=</span> <span class="nf">encode</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Input Array&#34;</span><span class="p">,</span> <span class="nx">inputArray</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Encoded String:&#34;</span><span class="p">,</span> <span class="nx">encodedString</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Decoded String:&#34;</span><span class="p">,</span> <span class="nf">decode</span><span class="p">(</span><span class="nx">encodedString</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Input Array [Hello World]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Encoded String: 5#Hello5#World</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Decoded String: [Hello World]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Input Array [Hel,lo World]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Encoded String: 6#Hel,lo5#World</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Decoded String: [Hel,lo World]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Input Array [Hel\,\lo World]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Encoded String: 8#Hel\,\lo5#World</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Decoded String: [Hel\,\lo World]</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://www.lintcode.com/problem/659/" target="_blank">659 · Encode and Decode Strings</a><br>
<a href="https://www.youtube.com/watch?v=B1k_sxOSgv8" target="_blank">Encode and Decode Strings - Leetcode 271 - Python</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Checking the Validity of a Sudoku Grid</title>
      <link>http://www.avni.sh/posts/data-structures-and-algorithms/is-valid-sudoku/</link>
      <pubDate>Thu, 02 Nov 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/data-structures-and-algorithms/is-valid-sudoku/</guid>
      <description>Implementing an isValidSudoku function that takes a matrix representing a Sudoku grid as inputs and returns true if it is valid and false otherwise</description>
      <content:encoded><![CDATA[<h1 id="problem-statement">Problem Statement</h1>
<p>We have to implement an <code>isValidSudoku</code> function that takes a 9x9 matrix (representing a <a href="https://sudoku.com/how-to-play/sudoku-rules-for-complete-beginners/" target="_blank">Sudoku</a> grid) as input and returns <code>true</code> if the grid is valid and <code>false</code> otherwise.</p>
<p align="center"><img src="is-valid-sudoku-problem.png" alt="Sudoku Grid"></p>
<p align="center"><small><i>Sudoku Grid</i></small></p>
<p>A Sudoku grid is valid if</p>
<ul>
<li>Every row contains digits from 1 to 9 without repetition.</li>
</ul>
<p align="center"><img src="is-valid-sudoku-rows.png" alt="Rows in a Sudoku Grid"></p>
<p align="center"><small><i>Rows in a Sudoku Grid</i></small></p>
<ul>
<li>Every column contains digits from 1 to 9 without repetition.</li>
</ul>
<p align="center"><img src="is-valid-sudoku-columns.png" alt="Columns in a Sudoku Grid"></p>
<p align="center"><small><i>Columns in a Sudoku Grid</i></small></p>
<ul>
<li>Every 3x3 sub-matrix contains digits from 1 to 9 without repetition.</li>
</ul>
<p align="center"><img src="is-valid-sudoku-sub-matrix.png" alt="Sub Matrices in a Sudoku Grid"></p>
<p align="center"><small><i>Sub-Matrices in a Sudoku Grid</i></small></p>
<p>The input Sudoku table could be incomplete where &ldquo;<code>.</code>&rdquo; will  represent an empty cell.</p>
<h1 id="optimal-solution">Optimal Solution</h1>
<p>The time complexity of validating a single row or column for repetition using a hashmap (like in <a href="/posts/computer-science/interview-preparation/contains-duplicate/" target="_blank">containsDuplicate</a>) will be $O(9)$. Repeating this process for every row and column in the input matrix will result in total time complexity of $9 \times O(9) + 9 \times O(9)$.</p>
<p>To validate all 3x3 sub-matrices we have to iterate over every 3rd row and column of the Sudoku grid. On each iteration, we will start from the top-left corner of the 3x3 grid and reach the bottom-right corner using nested loops. The total time complexity of validating each 3x3 submatrix will be $9 \times O(3) \times O(3)$.</p>
<p>Since the total time complexity of this solution will be constant for all inputs (because the Sudoku grid has a constant size of 9x9) this is the optimal solution.</p>
<h2 id="psuedo-code-for-the-optimal-solution">Psuedo code for the Optimal Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">loop row_index from 0 to 9
</span></span><span class="line"><span class="cl">  row_hashmap = Hashmap()
</span></span><span class="line"><span class="cl">  sudoku_row = sudoku_grid[row_index]
</span></span><span class="line"><span class="cl">  loop column_index from 0 to 9
</span></span><span class="line"><span class="cl">    if row_hashmap[sudoku_row[column_index]]
</span></span><span class="line"><span class="cl">      return false
</span></span><span class="line"><span class="cl">    else
</span></span><span class="line"><span class="cl">      row_hashmap[sudoku_row[column_index]] = 1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">loop column_index from 0 to 9
</span></span><span class="line"><span class="cl">  column_hashmap = Hashmap()
</span></span><span class="line"><span class="cl">  loop row_index from 0 to 9
</span></span><span class="line"><span class="cl">    value = sudoku_grid[row_index][column_index]
</span></span><span class="line"><span class="cl">    if column_hashmap[value]
</span></span><span class="line"><span class="cl">      return false
</span></span><span class="line"><span class="cl">    else 
</span></span><span class="line"><span class="cl">      column_hashmap[value] = 1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">loop row_index from 0 to 6 with step 3
</span></span><span class="line"><span class="cl">  loop column_index from 0 to 6 with step 3
</span></span><span class="line"><span class="cl">    sub_matrix_hashmap = Hashmap()
</span></span><span class="line"><span class="cl">    loop sm_row_index from 0 to 2
</span></span><span class="line"><span class="cl">      loop sm_column_index from 0 to 2
</span></span><span class="line"><span class="cl">        r_value = row_index+sm_row_index
</span></span><span class="line"><span class="cl">        c_value = column_index+sm_column_index
</span></span><span class="line"><span class="cl">        if sub_matrix_hashmap[r_value][c_value]
</span></span><span class="line"><span class="cl">          return false
</span></span><span class="line"><span class="cl">        else
</span></span><span class="line"><span class="cl">          sub_matrix_hashmap[r_value][c_value] = 1
</span></span><span class="line"><span class="cl">	
</span></span></code></pre></div><h2 id="time-complexity-analysis">Time Complexity Analysis</h2>
<h3 id="best-case-scenario">Best Case Scenario</h3>
<p>The best-case input for the optimal solution will be a completed Sudoku grid. The time taken to return the result will be $9 \times O(9) + 9 \times O(9) + O(81)$ which could be simplified to $O(1)$.</p>
<h3 id="worst-case-scenario">Worst Case Scenario</h3>
<p>In the worst-case scenario, the input will be an invalid Sudoku grid. The time taken to produce the result will be the same as the best-case scenario i.e. O(1).</p>
<h2 id="space-complexity-analysis">Space Complexity Analysis</h2>
<p>The space complexity for the optimal solution will be the sum of memory space required by the <code>row_hashmap</code>, <code>column_hashmap</code>, and <code>sub_matrix_hashmap</code> i.e. $O(9)+O(9)+O(9)$ which could be simplified to $O(1)$.</p>
<h2 id="code-for-the-optimal-solution">Code for the Optimal Solution</h2>
<p>First, we will implement the <code>validCellValue</code> function to check if the value in a cell is within 1 to 9.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">validCellValue</span><span class="p">(</span><span class="nx">inputValue</span> <span class="kt">byte</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Converting byte value to integer</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// to validate if inputValue lies between 1-len(board)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">intInputValue</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">strconv</span><span class="p">.</span><span class="nf">Atoi</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">inputValue</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">((</span><span class="nx">intInputValue</span><span class="p">&lt;</span><span class="mi">10</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="nx">intInputValue</span><span class="p">&gt;</span><span class="mi">0</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>To validate each row we can create a function called <code>checkRowValidity</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">checkRowValidity</span><span class="p">(</span><span class="nx">board</span> <span class="p">[][]</span><span class="kt">byte</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Iterating over each row</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// The length of the board could be hard coded to 9</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">rowIndex</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">rowIndex</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span><span class="nx">rowIndex</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// The rowHashMap would be used to check for</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// repeating values in the row</span>
</span></span><span class="line"><span class="cl">        <span class="nx">rowHashMap</span><span class="o">:=</span><span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">byte</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// Iterating over each column in the row</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">colIndex</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">colIndex</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span><span class="nx">colIndex</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">cellValue</span> <span class="o">:=</span> <span class="nx">board</span><span class="p">[</span><span class="nx">rowIndex</span><span class="p">][</span><span class="nx">colIndex</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            <span class="c1">// If the value of the cell isn&#39;t blank i.e. &#34;.&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">cellValue</span><span class="p">)</span> <span class="o">!=</span> <span class="s">&#34;.&#34;</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">                
</span></span><span class="line"><span class="cl">                <span class="c1">// If the cell value is within 1-9</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span><span class="p">(</span><span class="nf">validCellValue</span><span class="p">(</span><span class="nx">cellValue</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl">                    
</span></span><span class="line"><span class="cl">                    <span class="c1">// Check for value in rowHashMap</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">rowHashMap</span><span class="p">[</span><span class="nx">cellValue</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                    <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                        
</span></span><span class="line"><span class="cl">                        <span class="c1">// Exit the function if we</span>
</span></span><span class="line"><span class="cl">                        <span class="c1">// encountered a repeating value</span>
</span></span><span class="line"><span class="cl">                        <span class="c1">// in the current row</span>
</span></span><span class="line"><span class="cl">                        <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        
</span></span><span class="line"><span class="cl">                        <span class="c1">// If value isn&#39;t present</span>
</span></span><span class="line"><span class="cl">                        <span class="c1">// then add it the the hashmap</span>
</span></span><span class="line"><span class="cl">                        <span class="nx">rowHashMap</span><span class="p">[</span><span class="nx">cellValue</span><span class="p">]</span> <span class="p">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    
</span></span><span class="line"><span class="cl">                    <span class="c1">// Exit the function if we</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">// encountered a value that&#39;s not</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">// within range 1-9</span>
</span></span><span class="line"><span class="cl">                    <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>We can implement a similar function <code>checkColumnValidity</code> to validate columns.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">checkColValidity</span><span class="p">(</span><span class="nx">board</span> <span class="p">[][]</span><span class="kt">byte</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Iterating over each column</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">colIndex</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">colIndex</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span><span class="nx">colIndex</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// The colHashMap would be used to check for</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// repeating values in the column</span>
</span></span><span class="line"><span class="cl">        <span class="nx">colHashMap</span><span class="o">:=</span><span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">byte</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Iterating over each row in the column</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">rowIndex</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">rowIndex</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span><span class="nx">rowIndex</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">cellValue</span> <span class="o">:=</span> <span class="nx">board</span><span class="p">[</span><span class="nx">rowIndex</span><span class="p">][</span><span class="nx">colIndex</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// If the value of the cell isn&#39;t blank i.e. &#34;.&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">cellValue</span><span class="p">)</span><span class="o">!=</span><span class="s">&#34;.&#34;</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">// If the cell value is within 1-9</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span><span class="p">(</span><span class="nf">validCellValue</span><span class="p">(</span><span class="nx">cellValue</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="c1">// Check for value in colHashMap</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">colHashMap</span><span class="p">[</span><span class="nx">cellValue</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                    <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                        <span class="c1">// Exit the function if we</span>
</span></span><span class="line"><span class="cl">                        <span class="c1">// encountered a repeating value</span>
</span></span><span class="line"><span class="cl">                        <span class="c1">// in the current column</span>
</span></span><span class="line"><span class="cl">                        <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                        <span class="c1">// If value isn&#39;t present</span>
</span></span><span class="line"><span class="cl">                        <span class="c1">// then add it the the hashmap</span>
</span></span><span class="line"><span class="cl">                        <span class="nx">colHashMap</span><span class="p">[</span><span class="nx">cellValue</span><span class="p">]</span> <span class="p">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="c1">// Exit the function if we</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">// encountered a value that&#39;s not</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">// within range 1-9</span>
</span></span><span class="line"><span class="cl">                    <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>For validating every 3x3 sub-matrix we can implement <code>checkSubMatrixValidity</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">checkSubMatrixValidity</span><span class="p">(</span><span class="nx">board</span> <span class="p">[][]</span><span class="kt">byte</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Iterating over every 3rd row</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">rowIndex</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">rowIndex</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span><span class="nx">rowIndex</span><span class="o">+=</span><span class="mi">3</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// Iterating over every 3rd column</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">colIndex</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">colIndex</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span><span class="nx">colIndex</span><span class="o">+=</span><span class="mi">3</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            <span class="c1">// The subMatrixHashMap would be used to check for</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// repeating values in the 3x3 sub-matrix</span>
</span></span><span class="line"><span class="cl">            <span class="nx">subMatrixHashMap</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">byte</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            <span class="c1">// Iterate over every row in the sub-matrix</span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="mi">3</span><span class="p">;</span><span class="nx">i</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">// Iterate over every column in the sub-matrix</span>
</span></span><span class="line"><span class="cl">                <span class="k">for</span> <span class="nx">j</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">j</span><span class="p">&lt;</span><span class="mi">3</span><span class="p">;</span><span class="nx">j</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">cellValue</span> <span class="o">:=</span> <span class="nx">board</span><span class="p">[</span><span class="nx">rowIndex</span><span class="o">+</span><span class="nx">i</span><span class="p">][</span><span class="nx">colIndex</span><span class="o">+</span><span class="nx">j</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                    
</span></span><span class="line"><span class="cl">                    <span class="c1">// If the value of the cell isn&#39;t blank i.e. &#34;.&#34;</span>
</span></span><span class="line"><span class="cl">                    <span class="k">if</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">cellValue</span><span class="p">)</span><span class="o">!=</span><span class="s">&#34;.&#34;</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                        <span class="c1">// If the cell value is within 1-9</span>
</span></span><span class="line"><span class="cl">                        <span class="k">if</span><span class="p">(</span><span class="nf">validCellValue</span><span class="p">(</span><span class="nx">cellValue</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl">                            
</span></span><span class="line"><span class="cl">                            <span class="c1">// Check for value in subMatrixHashMap</span>
</span></span><span class="line"><span class="cl">                            <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">subMatrixHashMap</span><span class="p">[</span><span class="nx">cellValue</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                            <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                                <span class="c1">// Exit the function if we</span>
</span></span><span class="line"><span class="cl">                                <span class="c1">// encountered a repeating value</span>
</span></span><span class="line"><span class="cl">                                <span class="c1">// in the current sub-matrix</span>
</span></span><span class="line"><span class="cl">                                <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">                            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                                <span class="c1">// If value isn&#39;t present</span>
</span></span><span class="line"><span class="cl">                                <span class="c1">// then add it the the hashmap</span>
</span></span><span class="line"><span class="cl">                                <span class="nx">subMatrixHashMap</span><span class="p">[</span><span class="nx">cellValue</span><span class="p">]</span> <span class="p">=</span> <span class="mi">1</span> 
</span></span><span class="line"><span class="cl">                            <span class="p">}</span>
</span></span><span class="line"><span class="cl">                        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                            <span class="c1">// Exit the function if we</span>
</span></span><span class="line"><span class="cl">                            <span class="c1">// encountered a value that&#39;s not</span>
</span></span><span class="line"><span class="cl">                            <span class="c1">// within range 1-9</span>
</span></span><span class="line"><span class="cl">                            <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">                        <span class="p">}</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The <code>isvalidSudoku</code> function will validate the <code>board</code> by calling <code>checkRowValidity</code>, <code>checkColumnValidity</code>, and <code>checkSubMatrixValidity</code> and if all three functions return <code>true</code> then the input Sudoku board is valid.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">isValidSudoku</span><span class="p">(</span><span class="nx">board</span> <span class="p">[][]</span><span class="kt">byte</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="nf">checkRowValidity</span><span class="p">(</span><span class="nx">board</span><span class="p">)</span> <span class="o">&amp;&amp;</span> 
</span></span><span class="line"><span class="cl">        <span class="nf">checkColValidity</span><span class="p">(</span><span class="nx">board</span><span class="p">)</span> <span class="o">&amp;&amp;</span> 
</span></span><span class="line"><span class="cl">        <span class="nf">checkSubMatrixValidity</span><span class="p">(</span><span class="nx">board</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="complete-code-for-the-optimal-solution">Complete Code for the Optimal Solution</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;strconv&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">validCellValue</span><span class="p">(</span><span class="nx">inputValue</span> <span class="kt">byte</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Converting byte value to integer</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// to validate if inputValue lies between 1-len(board)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">intInputValue</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">strconv</span><span class="p">.</span><span class="nf">Atoi</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">inputValue</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">((</span><span class="nx">intInputValue</span><span class="p">&lt;</span><span class="mi">10</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="nx">intInputValue</span><span class="p">&gt;</span><span class="mi">0</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">checkRowValidity</span><span class="p">(</span><span class="nx">board</span> <span class="p">[][]</span><span class="kt">byte</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Iterating over each row</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// The length of board the could be hard coded to 9</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">rowIndex</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">rowIndex</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span><span class="nx">rowIndex</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// The rowHashMap would be used to check for</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// repeating values in the row</span>
</span></span><span class="line"><span class="cl">        <span class="nx">rowHashMap</span><span class="o">:=</span><span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">byte</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// Iterating over each column in the row</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">colIndex</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">colIndex</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span><span class="nx">colIndex</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">cellValue</span> <span class="o">:=</span> <span class="nx">board</span><span class="p">[</span><span class="nx">rowIndex</span><span class="p">][</span><span class="nx">colIndex</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            <span class="c1">// If the value of the cell isn&#39;t blank i.e. &#34;.&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">cellValue</span><span class="p">)</span> <span class="o">!=</span> <span class="s">&#34;.&#34;</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">                
</span></span><span class="line"><span class="cl">                <span class="c1">// If the cell value is within 1-9</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span><span class="p">(</span><span class="nf">validCellValue</span><span class="p">(</span><span class="nx">cellValue</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl">                    
</span></span><span class="line"><span class="cl">                    <span class="c1">// Check for value in rowHashMap</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">rowHashMap</span><span class="p">[</span><span class="nx">cellValue</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                    <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                        
</span></span><span class="line"><span class="cl">                        <span class="c1">// Exit the function if we</span>
</span></span><span class="line"><span class="cl">                        <span class="c1">// encountered a repeating value</span>
</span></span><span class="line"><span class="cl">                        <span class="c1">// in the current row</span>
</span></span><span class="line"><span class="cl">                        <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        
</span></span><span class="line"><span class="cl">                        <span class="c1">// If value isn&#39;t present</span>
</span></span><span class="line"><span class="cl">                        <span class="c1">// then add it the the hashmap</span>
</span></span><span class="line"><span class="cl">                        <span class="nx">rowHashMap</span><span class="p">[</span><span class="nx">cellValue</span><span class="p">]</span> <span class="p">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    
</span></span><span class="line"><span class="cl">                    <span class="c1">// Exit the function if we</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">// encountered a value that&#39;s not</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">// within range 1-9</span>
</span></span><span class="line"><span class="cl">                    <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">checkColValidity</span><span class="p">(</span><span class="nx">board</span> <span class="p">[][]</span><span class="kt">byte</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Iterating over each column</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">colIndex</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">colIndex</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span><span class="nx">colIndex</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// The colHashMap would be used to check for</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// repeating values in the column</span>
</span></span><span class="line"><span class="cl">        <span class="nx">colHashMap</span><span class="o">:=</span><span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">byte</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Iterating over each row in the column</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">rowIndex</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">rowIndex</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span><span class="nx">rowIndex</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">cellValue</span> <span class="o">:=</span> <span class="nx">board</span><span class="p">[</span><span class="nx">rowIndex</span><span class="p">][</span><span class="nx">colIndex</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// If the value of the cell isn&#39;t blank i.e. &#34;.&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">cellValue</span><span class="p">)</span><span class="o">!=</span><span class="s">&#34;.&#34;</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">// If the cell value is within 1-9</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span><span class="p">(</span><span class="nf">validCellValue</span><span class="p">(</span><span class="nx">cellValue</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="c1">// Check for value in colHashMap</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">colHashMap</span><span class="p">[</span><span class="nx">cellValue</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                    <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                        <span class="c1">// Exit the function if we</span>
</span></span><span class="line"><span class="cl">                        <span class="c1">// encountered a repeating value</span>
</span></span><span class="line"><span class="cl">                        <span class="c1">// in the current column</span>
</span></span><span class="line"><span class="cl">                        <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                        <span class="c1">// If value isn&#39;t present</span>
</span></span><span class="line"><span class="cl">                        <span class="c1">// then add it the the hashmap</span>
</span></span><span class="line"><span class="cl">                        <span class="nx">colHashMap</span><span class="p">[</span><span class="nx">cellValue</span><span class="p">]</span> <span class="p">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="c1">// Exit the function if we</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">// encountered a value that&#39;s not</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">// within range 1-9</span>
</span></span><span class="line"><span class="cl">                    <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">checkSubMatrixValidity</span><span class="p">(</span><span class="nx">board</span> <span class="p">[][]</span><span class="kt">byte</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Iterating over every 3rd row</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">rowIndex</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">rowIndex</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span><span class="nx">rowIndex</span><span class="o">+=</span><span class="mi">3</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// Iterating over every 3rd column</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">colIndex</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">colIndex</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span><span class="nx">colIndex</span><span class="o">+=</span><span class="mi">3</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            <span class="c1">// The subMatrixHashMap would be used to check for</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// repeating values in the 3x3 sub-matrix</span>
</span></span><span class="line"><span class="cl">            <span class="nx">subMatrixHashMap</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">byte</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            <span class="c1">// Iterate over every row in the sub-matrix</span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="mi">3</span><span class="p">;</span><span class="nx">i</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">// Iterate over every column in the sub-matrix</span>
</span></span><span class="line"><span class="cl">                <span class="k">for</span> <span class="nx">j</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">j</span><span class="p">&lt;</span><span class="mi">3</span><span class="p">;</span><span class="nx">j</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">cellValue</span> <span class="o">:=</span> <span class="nx">board</span><span class="p">[</span><span class="nx">rowIndex</span><span class="o">+</span><span class="nx">i</span><span class="p">][</span><span class="nx">colIndex</span><span class="o">+</span><span class="nx">j</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                    
</span></span><span class="line"><span class="cl">                    <span class="c1">// If the value of the cell isn&#39;t blank i.e. &#34;.&#34;</span>
</span></span><span class="line"><span class="cl">                    <span class="k">if</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">cellValue</span><span class="p">)</span><span class="o">!=</span><span class="s">&#34;.&#34;</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                        <span class="c1">// If the cell value is within 1-9</span>
</span></span><span class="line"><span class="cl">                        <span class="k">if</span><span class="p">(</span><span class="nf">validCellValue</span><span class="p">(</span><span class="nx">cellValue</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl">                            
</span></span><span class="line"><span class="cl">                            <span class="c1">// Check for value in subMatrixHashMap</span>
</span></span><span class="line"><span class="cl">                            <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">subMatrixHashMap</span><span class="p">[</span><span class="nx">cellValue</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                            <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                                <span class="c1">// Exit the function if we</span>
</span></span><span class="line"><span class="cl">                                <span class="c1">// encountered a repeating value</span>
</span></span><span class="line"><span class="cl">                                <span class="c1">// in the current sub-matrix</span>
</span></span><span class="line"><span class="cl">                                <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">                            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                                <span class="c1">// If value isn&#39;t present</span>
</span></span><span class="line"><span class="cl">                                <span class="c1">// then add it the the hashmap</span>
</span></span><span class="line"><span class="cl">                                <span class="nx">subMatrixHashMap</span><span class="p">[</span><span class="nx">cellValue</span><span class="p">]</span> <span class="p">=</span> <span class="mi">1</span> 
</span></span><span class="line"><span class="cl">                            <span class="p">}</span>
</span></span><span class="line"><span class="cl">                        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                            <span class="c1">// Exit the function if we</span>
</span></span><span class="line"><span class="cl">                            <span class="c1">// encountered a value that&#39;s not</span>
</span></span><span class="line"><span class="cl">                            <span class="c1">// within range 1-9</span>
</span></span><span class="line"><span class="cl">                            <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">                        <span class="p">}</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">isValidSudoku</span><span class="p">(</span><span class="nx">board</span> <span class="p">[][]</span><span class="kt">byte</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="nf">checkRowValidity</span><span class="p">(</span><span class="nx">board</span><span class="p">)</span> <span class="o">&amp;&amp;</span> 
</span></span><span class="line"><span class="cl">        <span class="nf">checkColValidity</span><span class="p">(</span><span class="nx">board</span><span class="p">)</span> <span class="o">&amp;&amp;</span> 
</span></span><span class="line"><span class="cl">        <span class="nf">checkSubMatrixValidity</span><span class="p">(</span><span class="nx">board</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// A valid sudoku grid</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// inputBoard := [][]string{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;5&#34;, &#34;3&#34;, &#34;.&#34;, &#34;.&#34;, &#34;7&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;6&#34;, &#34;.&#34;, &#34;.&#34;, &#34;1&#34;, &#34;9&#34;, &#34;5&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;.&#34;, &#34;9&#34;, &#34;8&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;6&#34;, &#34;.&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;8&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;6&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;3&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;4&#34;, &#34;.&#34;, &#34;.&#34;, &#34;8&#34;, &#34;.&#34;, &#34;3&#34;, &#34;.&#34;, &#34;.&#34;, &#34;1&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;7&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;2&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;6&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;.&#34;, &#34;6&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;2&#34;, &#34;8&#34;, &#34;.&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;4&#34;, &#34;1&#34;, &#34;9&#34;, &#34;.&#34;, &#34;.&#34;, &#34;5&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;8&#34;, &#34;.&#34;, &#34;.&#34;, &#34;7&#34;, &#34;9&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// }</span>
</span></span><span class="line"><span class="cl">    <span class="nx">inputBoard</span> <span class="o">:=</span> <span class="p">[][]</span><span class="kt">byte</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">53</span><span class="p">,</span><span class="mi">51</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">55</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">},</span> 
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">54</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">49</span><span class="p">,</span><span class="mi">57</span><span class="p">,</span><span class="mi">53</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">},</span> 
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">46</span><span class="p">,</span><span class="mi">57</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">54</span><span class="p">,</span><span class="mi">46</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">54</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">51</span><span class="p">},</span> 
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">52</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">51</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">49</span><span class="p">},</span> 
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">55</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">50</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">54</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">46</span><span class="p">,</span><span class="mi">54</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">50</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">52</span><span class="p">,</span><span class="mi">49</span><span class="p">,</span><span class="mi">57</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">53</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">55</span><span class="p">,</span><span class="mi">57</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Validitity of sudoku grid:&#34;</span><span class="p">,</span> <span class="nf">isValidSudoku</span><span class="p">(</span><span class="nx">inputBoard</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// An invalid sudoku grid (Repeating 8s in first column)</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// inputBoard := [][]string{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;8&#34;, &#34;3&#34;, &#34;.&#34;, &#34;.&#34;, &#34;7&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;6&#34;, &#34;.&#34;, &#34;.&#34;, &#34;1&#34;, &#34;9&#34;, &#34;5&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;.&#34;, &#34;9&#34;, &#34;8&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;6&#34;, &#34;.&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;8&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;6&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;3&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;4&#34;, &#34;.&#34;, &#34;.&#34;, &#34;8&#34;, &#34;.&#34;, &#34;3&#34;, &#34;.&#34;, &#34;.&#34;, &#34;1&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;7&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;2&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;6&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;.&#34;, &#34;6&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;2&#34;, &#34;8&#34;, &#34;.&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;4&#34;, &#34;1&#34;, &#34;9&#34;, &#34;.&#34;, &#34;.&#34;, &#34;5&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;8&#34;, &#34;.&#34;, &#34;.&#34;, &#34;7&#34;, &#34;9&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// }</span>
</span></span><span class="line"><span class="cl">    <span class="nx">inputBoard</span> <span class="p">=</span> <span class="p">[][]</span><span class="kt">byte</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">56</span><span class="p">,</span><span class="mi">51</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">55</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">},</span> 
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">54</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">49</span><span class="p">,</span><span class="mi">57</span><span class="p">,</span><span class="mi">53</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">},</span> 
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">46</span><span class="p">,</span><span class="mi">57</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">54</span><span class="p">,</span><span class="mi">46</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">54</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">51</span><span class="p">},</span> 
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">52</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">51</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">49</span><span class="p">},</span> 
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">55</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">50</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">54</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">46</span><span class="p">,</span><span class="mi">54</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">50</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">52</span><span class="p">,</span><span class="mi">49</span><span class="p">,</span><span class="mi">57</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">53</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">55</span><span class="p">,</span><span class="mi">57</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Validitity of sudoku grid:&#34;</span><span class="p">,</span> <span class="nf">isValidSudoku</span><span class="p">(</span><span class="nx">inputBoard</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// An invalid sudoku grid (Repeating 8s in the first 3x3 submatrix)</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// inputBoard := [][]string{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;5&#34;, &#34;3&#34;, &#34;.&#34;, &#34;.&#34;, &#34;7&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;6&#34;, &#34;8&#34;, &#34;.&#34;, &#34;1&#34;, &#34;9&#34;, &#34;5&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;.&#34;, &#34;9&#34;, &#34;8&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;6&#34;, &#34;.&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;8&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;6&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;3&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;4&#34;, &#34;.&#34;, &#34;.&#34;, &#34;8&#34;, &#34;.&#34;, &#34;3&#34;, &#34;.&#34;, &#34;.&#34;, &#34;1&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;7&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;2&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;6&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;.&#34;, &#34;6&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;2&#34;, &#34;8&#34;, &#34;.&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;4&#34;, &#34;1&#34;, &#34;9&#34;, &#34;.&#34;, &#34;.&#34;, &#34;5&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//     {&#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;.&#34;, &#34;8&#34;, &#34;.&#34;, &#34;.&#34;, &#34;7&#34;, &#34;9&#34;},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// }</span>
</span></span><span class="line"><span class="cl">    <span class="nx">inputBoard</span> <span class="p">=</span> <span class="p">[][]</span><span class="kt">byte</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">53</span><span class="p">,</span><span class="mi">51</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">55</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">},</span> 
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">54</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">49</span><span class="p">,</span><span class="mi">57</span><span class="p">,</span><span class="mi">53</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">},</span> 
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">46</span><span class="p">,</span><span class="mi">57</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">54</span><span class="p">,</span><span class="mi">46</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">54</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">51</span><span class="p">},</span> 
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">52</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">51</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">49</span><span class="p">},</span> 
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">55</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">50</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">54</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">46</span><span class="p">,</span><span class="mi">54</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">50</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">52</span><span class="p">,</span><span class="mi">49</span><span class="p">,</span><span class="mi">57</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">53</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">46</span><span class="p">,</span><span class="mi">55</span><span class="p">,</span><span class="mi">57</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Validitity of sudoku grid:&#34;</span><span class="p">,</span> <span class="nf">isValidSudoku</span><span class="p">(</span><span class="nx">inputBoard</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Validitity of sudoku grid: true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Validitity of sudoku grid: false</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Validitity of sudoku grid: false</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://sudoku.com/how-to-play/sudoku-rules-for-complete-beginners/" target="_blank">How to Play Sudoku?</a><br>
<a href="https://leetcode.com/problems/valid-sudoku/" target="_blank">36. Valid Sudoku</a><br>
<a href="https://www.youtube.com/watch?v=TjFXEUCMqI8" target="_blank">Valid Sudoku - Amazon Interview Question - Leetcode 36 - Python</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Building a Product Array without the Element Itself</title>
      <link>http://www.avni.sh/posts/data-structures-and-algorithms/product-except-self/</link>
      <pubDate>Sat, 28 Oct 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/data-structures-and-algorithms/product-except-self/</guid>
      <description>Implementing a productExceptSelf function that returns an array of products of all the elements without the element at the same index in input array</description>
      <content:encoded><![CDATA[<h1 id="problem-statement">Problem Statement</h1>
<p>We have to implement a <code>productExceptSelf</code> function that takes an integer array <code>nums</code> as input and returns another array <code>answer</code> as output. The element <code>answer[i]</code> will be the product of all elements in <code>inputArray</code> except <code>inputArray[i]</code>.</p>
<p align="center"><img src="product-except-self-problem.png" alt="Problem Statement for productExceptSelf"></p>
<p>The implementation should not contain a division (<code>/</code>) operation because the <code>answer</code> array could also be created by iterating over all elements in <code>inputArray</code> and dividing them from the product of the complete array.</p>
<h1 id="brute-force-solution">Brute Force Solution</h1>
<p>The brute-force solution to this problem could be implemented using nested loops. Where the first loop will select an element from the array and the second loop will be used to calculate the product without the element from the first loop.</p>
<h2 id="psuedo-code-for-the-brute-force-solution">Psuedo-code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">answer = []
</span></span><span class="line"><span class="cl">loop index on nums
</span></span><span class="line"><span class="cl">	product = 1
</span></span><span class="line"><span class="cl">	loop index2 on nums
</span></span><span class="line"><span class="cl">		if index!=index2
</span></span><span class="line"><span class="cl">			product *= nums[index2]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	answer.append(product)
</span></span><span class="line"><span class="cl">return answer
</span></span></code></pre></div><h2 id="time-complexity-analysis">Time Complexity Analysis</h2>
<h3 id="best-case-scenario">Best Case Scenario</h3>
<p>The brute-force solution will return the <code>answer</code> array in $O(n^2)$ time for the best-case input. Since both the loops will iterate completely over the <code>nums</code> array.</p>
<h3 id="worst-case-scenario">Worst Case Scenario</h3>
<p>The worst-case scenario will also take $O(n^2)$ to return the solution.</p>
<h2 id="space-complexity-analysis">Space Complexity Analysis</h2>
<p>The <code>answer</code> array will require additional $O(n)$ memory.</p>
<h2 id="code-for-the-brute-force-solution">Code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">productExceptSelf</span><span class="p">(</span><span class="nx">nums</span> <span class="p">[]</span><span class="kt">int</span><span class="p">)([]</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">answer</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">product</span> <span class="o">:=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">index2</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index2</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">index2</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// Skip the element selected by the outer loop</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="nx">index</span><span class="o">!=</span><span class="nx">index2</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">product</span> <span class="o">*=</span> <span class="nx">nums</span><span class="p">[</span><span class="nx">index2</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="nx">answer</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">answer</span><span class="p">,</span> <span class="nx">product</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">answer</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">nums</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Product Except Self:&#34;</span><span class="p">,</span> <span class="nf">productExceptSelf</span><span class="p">(</span><span class="nx">nums</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">nums</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">45</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">67</span><span class="p">,</span> <span class="mi">86</span><span class="p">,</span> <span class="mi">23</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Product Except Self:&#34;</span><span class="p">,</span> <span class="nf">productExceptSelf</span><span class="p">(</span><span class="nx">nums</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Product Except Self: [24 12 8 6]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Product Except Self: [4505884 5963670 3026340 2357730 8815860]</span>
</span></span></code></pre></div><h1 id="optimized-solution">Optimized Solution</h1>
<p>If we have to improve the time complexity of brute-force solution then we have to think of something other than nested loops.</p>
<p>The &ldquo;product except self&rdquo; for an element <code>nums[i]</code> refers to the product of all elements before and after <code>nums[i]</code> i.e. <code>answer[i] = nums[0:i-1] * nums[i+1:]</code>. Thus, we can implement the <code>productExceptSelf</code> function with $O(n)$ time complexity if we calculate two arrays <code>prefix</code> and <code>suffix</code> where</p>
<ul>
<li><code>prefix[i]</code> is the product of all elements before <code>nums[i]</code></li>
</ul>
<p align="center"><img src="product-except-self-prefix.png" alt="Calculating prefix for nums array"></p>
<ul>
<li><code>suffix[i]</code> is the product of all elements after <code>nums[i]</code></li>
</ul>
<p align="center"><img src="product-except-self-suffix.png" alt="Calculating suffix for nums array"></p>
<p>and multiply them to create the <code>answer</code> array.</p>
<h2 id="psuedo-code-for-the-optimized-solution">Psuedo code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">prefix = []
</span></span><span class="line"><span class="cl">loop index on nums
</span></span><span class="line"><span class="cl">	prefixProduct = 1
</span></span><span class="line"><span class="cl">	prefix.append(prefixProduct)
</span></span><span class="line"><span class="cl">	prefixProduct *= nums[index]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">suffix = []
</span></span><span class="line"><span class="cl">loop index from length(nums)-1 to 0
</span></span><span class="line"><span class="cl">	suffixProduct = 1
</span></span><span class="line"><span class="cl">	suffix.append_at_start(suffixProduct)
</span></span><span class="line"><span class="cl">	suffixProduct *= nums[index]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">answer = []
</span></span><span class="line"><span class="cl">loop index on prefix
</span></span><span class="line"><span class="cl">	answer.append(prefix[index]*suffix[index])
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> return answer
</span></span></code></pre></div><h2 id="time-complexity-analysis-1">Time Complexity Analysis</h2>
<h3 id="best-case-scenario-1">Best Case Scenario</h3>
<p>The optimized solution will return the <code>answer</code> array in $O(n)$ time (generalized from $O(3n)$) since the time complexity of iterating over all three arrays (<code>prefix</code>, <code>suffix</code>, and <code>answer</code>) is $O(n)$.</p>
<h3 id="worst-case-scenario-1">Worst Case Scenario</h3>
<p>The time complexity of iterating over arrays in worst-case input is the same as in the best-case scenario. Thus, the total time complexity of the function remains the same i.e. $O(n)$.</p>
<h2 id="space-complexity-analysis-1">Space Complexity Analysis</h2>
<p>To store the <code>prefix</code>, <code>suffix</code>, and <code>answer</code> array we will need additional $O(3n)$ memory.
We can improve the space complexity if we use a single array for storing the products of <code>prefix</code> and <code>suffix</code> and return it as the <code>answer</code>.</p>
<h2 id="code-for-the-optimized-solution">Code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">productExceptSelf</span><span class="p">(</span><span class="nx">nums</span> <span class="p">[]</span><span class="kt">int</span><span class="p">)([]</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">prefix</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">prefixProduct</span> <span class="o">:=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">prefix</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">prefix</span><span class="p">,</span> <span class="nx">prefixProduct</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">prefixProduct</span> <span class="o">*=</span> <span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">suffix</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">suffixProduct</span> <span class="o">:=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Loop over the nums array in reverse</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// starting from the last element</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span><span class="nx">index</span><span class="p">&gt;(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span><span class="nx">index</span><span class="o">--</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// Append the element at the start</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// rather than at the end</span>
</span></span><span class="line"><span class="cl">        <span class="nx">suffix</span> <span class="p">=</span> <span class="nb">append</span><span class="p">([]</span><span class="kt">int</span><span class="p">{</span><span class="nx">suffixProduct</span><span class="p">},</span> <span class="nx">suffix</span><span class="o">...</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">suffixProduct</span> <span class="o">*=</span> <span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">answer</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">prefix</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// Multiply prefix and suffix elements</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// to create the answer array</span>
</span></span><span class="line"><span class="cl">        <span class="nx">answer</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">answer</span><span class="p">,</span> <span class="nx">prefix</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="o">*</span><span class="nx">suffix</span><span class="p">[</span><span class="nx">index</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">answer</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">nums</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Product Except Self:&#34;</span><span class="p">,</span> <span class="nf">productExceptSelf</span><span class="p">(</span><span class="nx">nums</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">nums</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">45</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">67</span><span class="p">,</span> <span class="mi">86</span><span class="p">,</span> <span class="mi">23</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Product Except Self:&#34;</span><span class="p">,</span> <span class="nf">productExceptSelf</span><span class="p">(</span><span class="nx">nums</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Product Except Self: [42 84 56 24]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Product Except Self: [4505884 5963670 3026340 2357730 8815860]</span>
</span></span></code></pre></div><h2 id="code-for-the-optimized-solution-constant-space-complexity">Code for the Optimized Solution (Constant Space Complexity)</h2>
<p>Assuming the memory space required by the <code>answer</code> array is constant i.e. $O(1)$.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">productExceptSelf</span><span class="p">(</span><span class="nx">nums</span> <span class="p">[]</span><span class="kt">int</span><span class="p">)([]</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">answer</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Fill up the answer array with prefixes</span>
</span></span><span class="line"><span class="cl">    <span class="nx">prefixProduct</span> <span class="o">:=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">answer</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">answer</span><span class="p">,</span> <span class="nx">prefixProduct</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">prefixProduct</span> <span class="o">*=</span> <span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Multiply suffixes with the existing</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// values in the answer array i.e. prefixes</span>
</span></span><span class="line"><span class="cl">    <span class="nx">suffixProduct</span> <span class="o">:=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span><span class="nx">index</span><span class="p">&gt;(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span><span class="nx">index</span><span class="o">--</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">answer</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span> <span class="o">*=</span> <span class="nx">suffixProduct</span>
</span></span><span class="line"><span class="cl">        <span class="nx">suffixProduct</span> <span class="o">*=</span> <span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">answer</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">nums</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Product Except Self:&#34;</span><span class="p">,</span> <span class="nf">productExceptSelf</span><span class="p">(</span><span class="nx">nums</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">nums</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">45</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">67</span><span class="p">,</span> <span class="mi">86</span><span class="p">,</span> <span class="mi">23</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Product Except Self:&#34;</span><span class="p">,</span> <span class="nf">productExceptSelf</span><span class="p">(</span><span class="nx">nums</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Product Except Self: [42 84 56 24]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Product Except Self: [4505884 5963670 3026340 2357730 8815860]</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://leetcode.com/problems/product-of-array-except-self/description/" target="_blank">238. Product of Array Except Self</a><br>
<a href="https://www.youtube.com/watch?v=bNvIQI2wAjk" target="_blank">Product of Array Except Self - Leetcode 238 - Python</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Finding Most Frequent Elements in an Array</title>
      <link>http://www.avni.sh/posts/data-structures-and-algorithms/top-k-frequent/</link>
      <pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/data-structures-and-algorithms/top-k-frequent/</guid>
      <description>Implementing a topKFrequent(nums, k) function that takes an array of integers and a value k as inputs and returns top k most frequent elements.</description>
      <content:encoded><![CDATA[<h1 id="problem-statement">Problem Statement</h1>
<p>We have to implement a <code>topKFrequent</code> function that takes an integer array and a value <code>k</code> as input and returns the <code>k</code> most frequent elements in the input array. For example, <code>topKFrequent({1, 1, 2, 2, 3, 5, 2}, 2)</code> will return the top <code>2</code> most frequent elements in the array i.e. <code>{2, 1}</code>.</p>
<p align="center"><img src="top-k-frequent-problem.png" alt="Problem Statement for topKFrequent"></p>
<p>If multiple elements have the same frequency, then any of them could be returned in the solution as long as its length is <code>k</code>.</p>
<p align="center"><img src="top-k-frequent-problem-2.png" alt="Problem Statement for topKFrequent"></p>
<h1 id="brute-force-solution">Brute Force Solution</h1>
<p>First, we have to gather the data for the frequency of array elements inside a hashmap. We have to group elements with the same frequency, so we&rsquo;ll invert the key and values in the hashmap from <code>element -&gt; count</code> to <code>count -&gt; [elements]</code>.</p>
<p align="center"><img src="top-k-frequent-brute-force.png" alt="Brute Force solution to topKFrequent"></p>
<p>We can also extract a list of frequencies from this hashmap which will be sorted in descending order to extract the top <code>k</code> elements.</p>
<h2 id="psuedo-code-for-the-brute-force-solution">Psuedo-code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">counter = HashMap()
</span></span><span class="line"><span class="cl">loop index on array
</span></span><span class="line"><span class="cl">  if counter[array[index]]
</span></span><span class="line"><span class="cl">    counter[array[index]]+=1
</span></span><span class="line"><span class="cl">  else
</span></span><span class="line"><span class="cl">    counter[array[index]]=1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">reverseCounter = HashMap()
</span></span><span class="line"><span class="cl">freq = []
</span></span><span class="line"><span class="cl">loop key, value in counter
</span></span><span class="line"><span class="cl">  if reverseCounter[value]
</span></span><span class="line"><span class="cl">    reverseCounter[value].append(key)
</span></span><span class="line"><span class="cl">  else
</span></span><span class="line"><span class="cl">    reverseCounter[value] = [key]
</span></span><span class="line"><span class="cl">  freq.append(value)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sort(freq, descending=True)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">topKElements = []
</span></span><span class="line"><span class="cl">loop index on freq
</span></span><span class="line"><span class="cl">  value = reverseCounter[freq[index]]
</span></span><span class="line"><span class="cl">  for fq in value
</span></span><span class="line"><span class="cl">    topKElements.append(fq)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    if len(topKElements)==k
</span></span><span class="line"><span class="cl">      return topKElements
</span></span></code></pre></div><h2 id="time-complexity-analysis">Time Complexity Analysis</h2>
<h3 id="best-case-scenario">Best Case Scenario</h3>
<p>The first loop over the array has $O(n)$ time complexity, where $n$ is the size of the input array.</p>
<p>Let&rsquo;s assume that the second loop also has $O(n)$ time complexity (<code>length(counter) == length(reverseCounter)</code>). In the best-case scenario, there will be only one key in <code>reverseCounter</code> i.e. all elements have the same frequency, which decreases the time complexity of this loop to $O(1)$.</p>
<p>The fastest sorting algorithm will sort the <code>freq</code> array in $O(n \log(n))$ time.</p>
<p>The final loop (over <code>freq</code>) will execute <code>k</code> times. On each iteration, it will also loop over the list stored in <code>reverseCounter[freq[index]]</code>. Since the loop will exit as soon as the length of the result array reaches <code>k</code> its time complexity could be generalized to $O(k)$.</p>
<p>Thus, the total time complexity of the best-case scenario for brute force solution will be $O(n) + O(1) + O(n \log(n)) + O(k)$, which could be generalized to $O(n \log n)$.</p>
<h3 id="worst-case-scenario">Worst Case Scenario</h3>
<p>In the worst-case scenario, all the elements in the input array will have distinct frequencies. Thus, the length of <code>counter</code> and <code>reverseCounter</code> will be the same resulting in total time complexity $O(n) + O(n) + O(n \log(n)) + O(k)$, which could also be generalized to $O(n \log n)$.</p>
<h2 id="space-complexity-analysis">Space Complexity Analysis</h2>
<p>The memory space used by <code>counter</code> and <code>reverseCounter</code> will be $O(n)+O(n)$. We are assuming that the <code>freq</code> array is sorted in place so it won&rsquo;t require additional memory space. Finally, the space complexity of the <code>topKElements</code> array will be $O(n)$ if <code>k=length(nums)</code>. Thus, the total space complexity of the brute-force solution could be simplified to $O(n)$.</p>
<h2 id="code-for-the-brute-force-solution">Code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;sort&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">topKElements</span><span class="p">(</span><span class="nx">nums</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">k</span> <span class="kt">int</span><span class="p">)([]</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// counter hashmap for storing frequency data</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// of elements in nums</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Time Complexity: O(n)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">counter</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">counter</span><span class="p">[</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">counter</span><span class="p">[</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]]</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">counter</span><span class="p">[</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]]</span> <span class="p">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// freq array for storing different frequencies</span>
</span></span><span class="line"><span class="cl">  <span class="kd">var</span> <span class="nx">freq</span> <span class="p">[]</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// reverseCounter maps frequencies to elements of</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// nums</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Time Complexity: O(n)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">reverseCounter</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">int</span><span class="p">][]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">value</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">counter</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">reverseCounter</span><span class="p">[</span><span class="nx">value</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">reverseCounter</span><span class="p">[</span><span class="nx">value</span><span class="p">]</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">reverseCounter</span><span class="p">[</span><span class="nx">value</span><span class="p">],</span> <span class="nx">key</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">reverseCounter</span><span class="p">[</span><span class="nx">value</span><span class="p">]</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="nx">key</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="nx">freq</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">freq</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Sorting freq in descending order</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Time Complexity: O(nlog(n))</span>
</span></span><span class="line"><span class="cl">  <span class="nx">sort</span><span class="p">.</span><span class="nf">Sort</span><span class="p">(</span><span class="nx">sort</span><span class="p">.</span><span class="nf">Reverse</span><span class="p">(</span><span class="nx">sort</span><span class="p">.</span><span class="nf">IntSlice</span><span class="p">(</span><span class="nx">freq</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Creating topKElements from the top k</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// elements in sorted freq array</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Time Complexity: O(k)</span>
</span></span><span class="line"><span class="cl">  <span class="kd">var</span> <span class="nx">topKElements</span> <span class="p">[]</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">freq</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">value</span> <span class="o">:=</span> <span class="nx">reverseCounter</span><span class="p">[</span><span class="nx">freq</span><span class="p">[</span><span class="nx">index</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl">      <span class="k">for</span> <span class="nx">index2</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index2</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span><span class="nx">index2</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">topKElements</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">topKElements</span><span class="p">,</span> <span class="nx">value</span><span class="p">[</span><span class="nx">index2</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">          <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">topKElements</span><span class="p">)</span><span class="o">==</span><span class="nx">k</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">              <span class="k">return</span> <span class="nx">topKElements</span>
</span></span><span class="line"><span class="cl">          <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">topKElements</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">  <span class="nx">nums</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="nx">k</span> <span class="o">:=</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Top&#34;</span><span class="p">,</span> <span class="nx">k</span><span class="p">,</span> <span class="s">&#34;elements in nums:&#34;</span><span class="p">,</span> <span class="nf">topKElements</span><span class="p">(</span><span class="nx">nums</span><span class="p">,</span> <span class="nx">k</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">nums</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="nx">k</span> <span class="p">=</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Top&#34;</span><span class="p">,</span> <span class="nx">k</span><span class="p">,</span> <span class="s">&#34;elements in nums:&#34;</span><span class="p">,</span> <span class="nf">topKElements</span><span class="p">(</span><span class="nx">nums</span><span class="p">,</span> <span class="nx">k</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Top 3 elements in nums: [1 2 3]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Top 2 elements in nums: [1 2]</span>
</span></span></code></pre></div><h1 id="optimized-solution">Optimized Solution</h1>
<p>The sorting operation on the frequency array has the highest time complexity ($O(n \log(n))$).</p>
<p>The highest frequency an element can achieve in an array is the length of the array (all the elements are the same) and the lowest frequency for an element is <code>1</code> (a single element in the array). Thus, instead of sorting frequencies, we can loop over the known range of frequencies and return the top <code>k</code> elements.</p>
<h2 id="psuedo-code-for-the-optimized-solution">Psuedo code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">counter = HashMap()
</span></span><span class="line"><span class="cl">loop index on array
</span></span><span class="line"><span class="cl">  if counter[array[index]]
</span></span><span class="line"><span class="cl">    counter[array[index]] += 1
</span></span><span class="line"><span class="cl">  else
</span></span><span class="line"><span class="cl">    counter[array[index]] = 1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">reverseCounter = HashMap()
</span></span><span class="line"><span class="cl">loop key, value on counter
</span></span><span class="line"><span class="cl">  if reverseCounter[value]
</span></span><span class="line"><span class="cl">    reverseCounter[value].append(key)
</span></span><span class="line"><span class="cl">  else
</span></span><span class="line"><span class="cl">    reverseCounter[value] = [key]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">topKElements = []
</span></span><span class="line"><span class="cl">loop index from (len(nums), 1)
</span></span><span class="line"><span class="cl">  if reverseCounter[index]
</span></span><span class="line"><span class="cl">    for value in reverseCounter[index]
</span></span><span class="line"><span class="cl">      topKElements.append(value)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      if len(topKElements) == k
</span></span><span class="line"><span class="cl">        return topKElements
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">return topKElements
</span></span></code></pre></div><h2 id="time-complexity-analysis-1">Time Complexity Analysis</h2>
<h3 id="best-case-scenario-1">Best Case Scenario</h3>
<p>In the best-case scenario (all elements have the same frequency), the time complexity of all loops except the one on <code>reverseCounter</code> will be $O(n)$ which sums up to $O(2n)$ for the complete function (could also be generalized to $O(n)$).</p>
<h3 id="worst-case-scenario-1">Worst Case Scenario</h3>
<p>For the worst-case scenario, where all elements have distinct frequencies, the time complexity of every loop is $O(n)$ resulting in $O(3n)$ (generalized to $O(n)$) time complexity for the complete function.</p>
<h2 id="space-complexity-analysis-1">Space Complexity Analysis</h2>
<p>The additional memory required by the optimized solution to store <code>counter</code>, <code>reverseCounter</code>, and <code>topKElements</code> will be $O(n)$.</p>
<h2 id="code-for-the-optimized-solution">Code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">topKElements</span><span class="p">(</span><span class="nx">nums</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">k</span> <span class="kt">int</span><span class="p">)([]</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">counter</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">counter</span><span class="p">[</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">counter</span><span class="p">[</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]]</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">counter</span><span class="p">[</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]]</span> <span class="p">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">reverseCounter</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">int</span><span class="p">][]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">value</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">counter</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">reverseCounter</span><span class="p">[</span><span class="nx">value</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">reverseCounter</span><span class="p">[</span><span class="nx">value</span><span class="p">]</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">reverseCounter</span><span class="p">[</span><span class="nx">value</span><span class="p">],</span> <span class="nx">key</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">reverseCounter</span><span class="p">[</span><span class="nx">value</span><span class="p">]</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="nx">key</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Instead of sorting the list of frequencies</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// We can loop over range (len(nums), 1)</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// and check if the value is present in</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// reverseCounter</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">topKElements</span> <span class="p">[]</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">freq</span><span class="o">:=</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">freq</span><span class="p">&gt;</span><span class="mi">0</span><span class="p">;</span><span class="nx">freq</span><span class="o">--</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">value</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">reverseCounter</span><span class="p">[</span><span class="nx">freq</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">val</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">value</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">topKElements</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">topKElements</span><span class="p">,</span> <span class="nx">val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">topKElements</span><span class="p">)</span> <span class="o">==</span> <span class="nx">k</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="k">return</span> <span class="nx">topKElements</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">topKElements</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">nums</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">k</span> <span class="o">:=</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Top&#34;</span><span class="p">,</span> <span class="nx">k</span><span class="p">,</span> <span class="s">&#34;elements in nums:&#34;</span><span class="p">,</span> <span class="nf">topKElements</span><span class="p">(</span><span class="nx">nums</span><span class="p">,</span> <span class="nx">k</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">nums</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">k</span> <span class="p">=</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Top&#34;</span><span class="p">,</span> <span class="nx">k</span><span class="p">,</span> <span class="s">&#34;elements in nums:&#34;</span><span class="p">,</span> <span class="nf">topKElements</span><span class="p">(</span><span class="nx">nums</span><span class="p">,</span> <span class="nx">k</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://leetcode.com/problems/top-k-frequent-elements/" target="_blank">347. Top K Frequent Elements</a><br>
<a href="https://www.youtube.com/watch?v=YPTqKIgVk-k" target="_blank">Top K Frequent Elements - Bucket Sort - Leetcode 347 - Python</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Group Anagrams in an Array</title>
      <link>http://www.avni.sh/posts/data-structures-and-algorithms/group-anagrams/</link>
      <pubDate>Sun, 22 Oct 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/data-structures-and-algorithms/group-anagrams/</guid>
      <description>Implementing a groupAnagrams function that takes an array of strings as input and returns another array with anagrams grouped together</description>
      <content:encoded><![CDATA[<h1 id="problem-statement">Problem Statement</h1>
<p>We have to implement a <code>groupAnagram</code> function that takes an array of strings as input and returns a new array with <a href="/posts/computer-science/interview-preparation/identifying-anagrams/" target="_blank">anagrams</a> grouped.</p>
<p align="center"><img src="group-anagrams-problem.png" alt="Problem Statement for groupAnagrams"></p>
<p>The input string array is assumed to be composed entirely of lowercase English characters.</p>
<h1 id="brute-force-solution">Brute Force Solution</h1>
<p>If two strings are anagrams then their sorted order will be the same. Thus, anagrams could be grouped under their sorted order.</p>
<p align="center"><img src="group-anagrams-brute-force.png" alt="Brute Force solution for groupAnagrams"></p>
<p>The brute-force implementation of <code>groupAnagram</code> uses a hashmap for grouping. In this hashmap the sorted string will be the key and the original strings will be the values (stored in an array). At the end of the function, we can iterate over the hashmap and create an array of grouped anagrams.</p>
<h2 id="psuedo-code-for-the-brute-force-solution">Psuedo-code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">hashmap = HashMap()
</span></span><span class="line"><span class="cl">loop index in stringArray
</span></span><span class="line"><span class="cl">  stringValue = stringArray[index]
</span></span><span class="line"><span class="cl">  sortedString = string(sort(stringValue))
</span></span><span class="line"><span class="cl">  if hashmap[sortedString]
</span></span><span class="line"><span class="cl">    hashmap[sortedString].append(stringValue)
</span></span><span class="line"><span class="cl">  else
</span></span><span class="line"><span class="cl">    hashmap[sortedString] = [stringValue]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">returnedList = []
</span></span><span class="line"><span class="cl">loop key, value in hashmap
</span></span><span class="line"><span class="cl">  returnedList.append(value)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">return returnedList
</span></span></code></pre></div><h2 id="time-complexity-analysis">Time Complexity Analysis</h2>
<h3 id="best-case-scenario">Best Case Scenario</h3>
<p>The time taken to sort individual strings is assumed to be $O(k \log(k))$ (the time complexity of the best sorting algorithm) where $k$ is the size of the string. Since we have to perform this operation on every element the sorting operation will be repeated $n$ time, where $n$ is the size of the array, resulting in $O(n \times k \log(k))$ time.</p>
<p align="center"><img src="group-anagrams-brute-force-best.png" alt="Best case scenario for Brute Force solution for groupAnagrams"></p>
<p>The best-case input will contain just a single set of anagrams i.e. the hashmap will contain just one key. The loop over hashmap values will be executed only once. Thus, the total time complexity of grouping anagrams will be $O(n \times k \log(k))$.</p>
<h3 id="worst-case-scenario">Worst Case Scenario</h3>
<p align="center"><img src="group-anagrams-brute-force-worst.png" alt="Worst case scenario for Brute Force solution for groupAnagrams"></p>
<p>The worst-case input array will contain zero anagrams and the hashmap will contain a key for each array element i.e. $n$ keys. Thus, the total time complexity of the function in the worst-case scenario will be $O(n + n \times k \log(k))$, which could be simplified to $O(n \times k \log(k))$.</p>
<h2 id="space-complexity-analysis">Space Complexity Analysis</h2>
<p>The additional space required to store the <code>hashmap</code> and <code>returnedList</code> will be $O(n)+O(n)$ or simply $O(n)$.</p>
<h2 id="code-for-the-brute-force-solution">Code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;sort&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;strings&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">sortString</span><span class="p">(</span><span class="nx">inputString</span> <span class="kt">string</span><span class="p">)(</span><span class="kt">string</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">listInputString</span> <span class="o">:=</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">Split</span><span class="p">(</span><span class="nx">inputString</span><span class="p">,</span> <span class="s">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">sort</span><span class="p">.</span><span class="nf">Strings</span><span class="p">(</span><span class="nx">listInputString</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">Join</span><span class="p">(</span><span class="nx">listInputString</span><span class="p">,</span> <span class="s">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">groupAnagrams</span><span class="p">(</span><span class="nx">strs</span> <span class="p">[]</span><span class="kt">string</span><span class="p">)([][]</span><span class="kt">string</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">hashmap</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">][]</span><span class="kt">string</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Loop over the strs and sort every string element</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">strs</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// The time complexity of the sorting operation</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// is assumed to be O(nlog(n))</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// where n is the size of the string</span>
</span></span><span class="line"><span class="cl">        <span class="nx">sortedString</span> <span class="o">:=</span> <span class="nf">sortString</span><span class="p">(</span><span class="nx">strs</span><span class="p">[</span><span class="nx">index</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// Group elements by their sorted order </span>
</span></span><span class="line"><span class="cl">        <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">hashmap</span><span class="p">[</span><span class="nx">sortedString</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">hashmap</span><span class="p">[</span><span class="nx">sortedString</span><span class="p">]</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">hashmap</span><span class="p">[</span><span class="nx">sortedString</span><span class="p">],</span> 
</span></span><span class="line"><span class="cl">                                           <span class="nx">strs</span><span class="p">[</span><span class="nx">index</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">hashmap</span><span class="p">[</span><span class="nx">sortedString</span><span class="p">]</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="nx">strs</span><span class="p">[</span><span class="nx">index</span><span class="p">]}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">groupedAnagrams</span> <span class="p">[][]</span><span class="kt">string</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Loop over hashmap and create a grouped anagrams list</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">value</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">hashmap</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">groupedAnagrams</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">groupedAnagrams</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">groupedAnagrams</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">anagramList</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;cat&#34;</span><span class="p">,</span> <span class="s">&#34;bat&#34;</span><span class="p">,</span> <span class="s">&#34;tan&#34;</span><span class="p">,</span> <span class="s">&#34;nat&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Grouping anagrams in list:&#34;</span><span class="p">,</span> <span class="nx">anagramList</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nf">groupAnagrams</span><span class="p">(</span><span class="nx">anagramList</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Grouping anagrams in list: [cat bat tan nat]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// [[cat] [bat] [tan nat]]</span>
</span></span></code></pre></div><h1 id="optimized-solution">Optimized Solution</h1>
<p>The time complexity of sorting a single string is $O(k \log(k))$. Instead of sorting, we can load the string into a <code>countHashmap</code> (maps characters to their count) and reduce the time complexity to $O(k)$.</p>
<p align="center"><img src="group-anagrams-optimized.png" alt="Optimized solution for groupAnagrams"></p>
<p>The <code>countHashMap</code> will be initialized with lowercase English characters (<code>a-z</code>) mapped to <code>0</code> (default count). The <code>load</code> function will iterate over the characters in the input string and increment their count, for example, <code>countHashMap.load(&quot;mat&quot;)</code> will increment the value of <code>m</code>, <code>a</code>, and <code>t</code> keys to <code>1</code>.</p>
<p>As we have to use <code>countHashMap</code> as a key to another hashmap, we can simplify its data to a single string of non-zero count characters and their value, for example, <code>baseball =&gt; {a:2, b:2, c:0, d:0, e:1, ..., l:2, ..., s:1, ..., z:0} =&gt; a2b2e1l2s1</code></p>
<h2 id="psuedo-code-for-the-optimized-solution">Psuedo code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">anagramHashmap = HashMap()
</span></span><span class="line"><span class="cl">loop index in stringArray
</span></span><span class="line"><span class="cl">  countHashmap = HashMap[a-z, 0-0]
</span></span><span class="line"><span class="cl">  countHashmap.load(stringArray[index])
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  if anagramHashmap[countHashMap]
</span></span><span class="line"><span class="cl">    anagramHashmap[countHashMap].append(stringArray[index])
</span></span><span class="line"><span class="cl">  else
</span></span><span class="line"><span class="cl">    anagramHashmap[countHashMap] = [stringArray[index]]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">returnedList = []
</span></span><span class="line"><span class="cl">for key, value in anagramHashmap
</span></span><span class="line"><span class="cl">  returnedList.append(value)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">return returnedList
</span></span></code></pre></div><h2 id="time-complexity-analysis-1">Time Complexity Analysis</h2>
<h3 id="best-case-scenario-1">Best Case Scenario</h3>
<p>The best-case input will contain only one set of anagrams. Thus the total time complexity of the function will be $O(n \times k)$.</p>
<h3 id="worst-case-scenario-1">Worst Case Scenario</h3>
<p>For the worst-case input (none of the strings are anagrams) the loop over <code>anagramHashMap</code> will take $O(n)$ time. Hence, the time complexity of the function will be $O(n \times k)$ (generalized from $O(n + n \times k)$).</p>
<h2 id="space-complexity-analysis-1">Space Complexity Analysis</h2>
<p>The size of <code>countHashMap</code> is constant i.e. $O(26)$. After adding the space required by <code>anagramHashMap</code> and <code>returnedList</code>, the total space complexity of the optimized solution will be $O(n)+O(n)+O(26)$, which could be simplified to $O(n)$.</p>
<h2 id="code-for-the-optimized-solution">Code for the Optimized Solution</h2>
<p>First, we have to implement a <code>generateCountHashMap</code> function that will return a hashmap with keys ranging from <code>a</code> to <code>z</code> mapped to their initial count i.e. <code>0</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">generateCountHashMap</span><span class="p">()(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">countHashMap</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// The time complexity of this function will</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// be constant (O(1)) since the loop will </span>
</span></span><span class="line"><span class="cl">    <span class="c1">// execute only 26 times on every function call</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">r</span><span class="o">:=</span><span class="sc">&#39;a&#39;</span><span class="p">;</span><span class="nx">r</span><span class="o">&lt;=</span><span class="sc">&#39;z&#39;</span><span class="p">;</span><span class="nx">r</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">countHashMap</span><span class="p">[</span><span class="nb">string</span><span class="p">(</span><span class="nx">r</span><span class="p">)]</span> <span class="p">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">countHashMap</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>To simplify the presentation of data in <code>countHashMap</code> we have to convert it into an equivalent string using the <code>loadStringValue</code> function.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">loadStringValue</span><span class="p">(</span><span class="nx">countHashMap</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                     <span class="nx">inputString</span> <span class="kt">string</span><span class="p">)(</span><span class="kt">string</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Assuming the size of inputString is k</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// the time complexity of executing this loop</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// will be O(k)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">inputString</span><span class="p">);</span><span class="nx">i</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">countHashMap</span><span class="p">[</span><span class="nb">string</span><span class="p">(</span><span class="nx">inputString</span><span class="p">[</span><span class="nx">i</span><span class="p">])]</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">returnString</span> <span class="p">[]</span><span class="kt">string</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// This loop has constant time complexity (O(1))</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">r</span><span class="o">:=</span><span class="sc">&#39;a&#39;</span><span class="p">;</span><span class="nx">r</span><span class="o">&lt;=</span><span class="sc">&#39;z&#39;</span><span class="p">;</span><span class="nx">r</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// Add non-zero count characters and their value</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// to the returnString</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nx">countHashMap</span><span class="p">[</span><span class="nb">string</span><span class="p">(</span><span class="nx">r</span><span class="p">)]&gt;</span><span class="mi">0</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">returnString</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">returnString</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                                  <span class="nb">string</span><span class="p">(</span><span class="nx">r</span><span class="p">),</span> 
</span></span><span class="line"><span class="cl">                                  <span class="nx">strconv</span><span class="p">.</span><span class="nf">Itoa</span><span class="p">(</span><span class="nx">countHashMap</span><span class="p">[</span><span class="nb">string</span><span class="p">(</span><span class="nx">r</span><span class="p">)]))</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">Join</span><span class="p">(</span><span class="nx">returnString</span><span class="p">,</span> <span class="s">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Finally, we use <code>generateCountHashMap</code> and <code>loadStringValue</code> to implement the <code>groupAnagrams</code> function.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">groupAnagrams</span><span class="p">(</span><span class="nx">strs</span> <span class="p">[]</span><span class="kt">string</span><span class="p">)([][]</span><span class="kt">string</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">  <span class="nx">anagramHashMap</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">][]</span><span class="kt">string</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">strs</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">stringValue</span> <span class="o">:=</span> <span class="nx">strs</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Constant time complexity</span>
</span></span><span class="line"><span class="cl">    <span class="nx">countHashMap</span> <span class="o">:=</span> <span class="nf">generateCountHashMap</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// The time complexity of this operation will be</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// O(k) where k is the size of stringValue</span>
</span></span><span class="line"><span class="cl">    <span class="nx">countHashMapStr</span> <span class="o">:=</span> <span class="nf">loadStringValue</span><span class="p">(</span><span class="nx">countHashMap</span><span class="p">,</span> <span class="nx">stringValue</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">anagramHashMap</span><span class="p">[</span><span class="nx">countHashMapStr</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Group elements by countHashMapStr</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">anagramHashMap</span><span class="p">[</span><span class="nx">countHashMapStr</span><span class="p">]</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                        <span class="nx">anagramHashMap</span><span class="p">[</span><span class="nx">countHashMapStr</span><span class="p">],</span> 
</span></span><span class="line"><span class="cl">                        <span class="nx">stringValue</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">anagramHashMap</span><span class="p">[</span><span class="nx">countHashMapStr</span><span class="p">]</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="nx">stringValue</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">  <span class="kd">var</span> <span class="nx">groupedAnagrams</span> <span class="p">[][]</span><span class="kt">string</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">value</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">anagramHashMap</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">groupedAnagrams</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">groupedAnagrams</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">groupedAnagrams</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="complete-code">Complete Code</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;strings&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;strconv&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">generateCountHashMap</span><span class="p">()(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">countHashMap</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// The time complexity of this function will</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// be constant (O(1)) since the loop will </span>
</span></span><span class="line"><span class="cl">    <span class="c1">// execute only 26 times on every function call</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">r</span><span class="o">:=</span><span class="sc">&#39;a&#39;</span><span class="p">;</span><span class="nx">r</span><span class="o">&lt;=</span><span class="sc">&#39;z&#39;</span><span class="p">;</span><span class="nx">r</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">countHashMap</span><span class="p">[</span><span class="nb">string</span><span class="p">(</span><span class="nx">r</span><span class="p">)]</span> <span class="p">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">countHashMap</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">loadStringValue</span><span class="p">(</span><span class="nx">countHashMap</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                     <span class="nx">inputString</span> <span class="kt">string</span><span class="p">)(</span><span class="kt">string</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Assuming the size of inputString is k</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// the time complexity of executing this loop</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// will be O(k)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">inputString</span><span class="p">);</span><span class="nx">i</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">countHashMap</span><span class="p">[</span><span class="nb">string</span><span class="p">(</span><span class="nx">inputString</span><span class="p">[</span><span class="nx">i</span><span class="p">])]</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">returnString</span> <span class="p">[]</span><span class="kt">string</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// This loop has constant time complexity (O(1))</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">r</span><span class="o">:=</span><span class="sc">&#39;a&#39;</span><span class="p">;</span><span class="nx">r</span><span class="o">&lt;=</span><span class="sc">&#39;z&#39;</span><span class="p">;</span><span class="nx">r</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// Add non-zero count characters and their value</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// to the returnString</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nx">countHashMap</span><span class="p">[</span><span class="nb">string</span><span class="p">(</span><span class="nx">r</span><span class="p">)]&gt;</span><span class="mi">0</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">returnString</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">returnString</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                                  <span class="nb">string</span><span class="p">(</span><span class="nx">r</span><span class="p">),</span> 
</span></span><span class="line"><span class="cl">                                  <span class="nx">strconv</span><span class="p">.</span><span class="nf">Itoa</span><span class="p">(</span><span class="nx">countHashMap</span><span class="p">[</span><span class="nb">string</span><span class="p">(</span><span class="nx">r</span><span class="p">)]))</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">Join</span><span class="p">(</span><span class="nx">returnString</span><span class="p">,</span> <span class="s">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">groupAnagrams</span><span class="p">(</span><span class="nx">strs</span> <span class="p">[]</span><span class="kt">string</span><span class="p">)([][]</span><span class="kt">string</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">  <span class="nx">anagramHashMap</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">][]</span><span class="kt">string</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">strs</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">stringValue</span> <span class="o">:=</span> <span class="nx">strs</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Constant time complexity</span>
</span></span><span class="line"><span class="cl">    <span class="nx">countHashMap</span> <span class="o">:=</span> <span class="nf">generateCountHashMap</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// The time complexity of this operation will be</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// O(k) where k is the size of stringValue</span>
</span></span><span class="line"><span class="cl">    <span class="nx">countHashMapStr</span> <span class="o">:=</span> <span class="nf">loadStringValue</span><span class="p">(</span><span class="nx">countHashMap</span><span class="p">,</span> <span class="nx">stringValue</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">anagramHashMap</span><span class="p">[</span><span class="nx">countHashMapStr</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Group elements by countHashMapStr</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">anagramHashMap</span><span class="p">[</span><span class="nx">countHashMapStr</span><span class="p">]</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                        <span class="nx">anagramHashMap</span><span class="p">[</span><span class="nx">countHashMapStr</span><span class="p">],</span> 
</span></span><span class="line"><span class="cl">                        <span class="nx">stringValue</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">anagramHashMap</span><span class="p">[</span><span class="nx">countHashMapStr</span><span class="p">]</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="nx">stringValue</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">  <span class="kd">var</span> <span class="nx">groupedAnagrams</span> <span class="p">[][]</span><span class="kt">string</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">value</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">anagramHashMap</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">groupedAnagrams</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">groupedAnagrams</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">groupedAnagrams</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">anagramList</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;cat&#34;</span><span class="p">,</span> <span class="s">&#34;bat&#34;</span><span class="p">,</span> <span class="s">&#34;tan&#34;</span><span class="p">,</span> <span class="s">&#34;nat&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Grouping anagrams in list:&#34;</span><span class="p">,</span> <span class="nx">anagramList</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nf">groupAnagrams</span><span class="p">(</span><span class="nx">anagramList</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Grouping anagrams in list: [cat bat tan nat]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// [[tan nat] [cat] [bat]]</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://leetcode.com/problems/group-anagrams/description/" target="_blank">49. Group Anagrams</a><br>
<a href="https://www.youtube.com/watch?v=vzdNOK2oB2E" target="_blank">Group Anagrams - Categorize Strings by Count - Leetcode 49</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Finding Elements in an Array that Sum Up to a Target Value</title>
      <link>http://www.avni.sh/posts/data-structures-and-algorithms/two-sums/</link>
      <pubDate>Sun, 15 Oct 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/data-structures-and-algorithms/two-sums/</guid>
      <description>Implementing a twoSums(nums, targetValue) function that returns the indices of two elements in nums which could be summed up to the targetValue</description>
      <content:encoded><![CDATA[<h1 id="problem-statement">Problem Statement</h1>
<p>We have to implement a <code>twoSums()</code> function that takes an integer array and a target value as inputs. It returns the indexes of two elements in the input array which could be summed up to the target value.</p>
<p>It is assumed that the input array contains only one valid pair of elements that sum up to the target value.</p>
<h1 id="brute-force-solution">Brute Force Solution</h1>
<p>The brute-force solution will find the sum of all element pairs in the array using nested loops.</p>
<p align="center"><img src="two-sums-brute-force.png" alt="Brute Force solution for twoSums problem"></p>
<h2 id="psuedo-code-for-the-brute-force-solution">Psuedo-code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">loop index1 in array
</span></span><span class="line"><span class="cl">    loop index2 in array
</span></span><span class="line"><span class="cl">        sum_value = array[index1]+array[index2]
</span></span><span class="line"><span class="cl">        if index1!=index2 and sum_value==target:
</span></span><span class="line"><span class="cl">            return index1, index2
</span></span><span class="line"><span class="cl">return none, none
</span></span></code></pre></div><h2 id="time-complexity-analysis">Time Complexity Analysis</h2>
<h3 id="best-case-scenario">Best Case Scenario</h3>
<p>If the sum of the first and second elements in the input array is equal to the target value, that would be the best-case runtime scenario. Since the inner and outer loop will be executed only once the time complexity will be $O(1)$.</p>
<h3 id="worst-case-scenario">Worst Case Scenario</h3>
<p>In the worst-case scenario, the input array won&rsquo;t contain any valid pair of elements. Thus, both loops will be executed completely resulting in $O(n^2)$ time complexity, where $n$ is the size of the input array.</p>
<h2 id="space-complexity-analysis">Space Complexity Analysis</h2>
<p>There isn&rsquo;t any additional memory used by the brute-force solution. Thus, the total space complexity will be $O(1)$.</p>
<h2 id="code-for-the-brute-force-solution">Code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">twoSums</span><span class="p">(</span><span class="nx">nums</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">target</span> <span class="kt">int</span><span class="p">)([]</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">i</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">j</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">j</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">j</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">sumValue</span> <span class="o">:=</span> <span class="nx">nums</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">+</span> <span class="nx">nums</span><span class="p">[</span><span class="nx">j</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="nx">i</span><span class="o">!=</span><span class="nx">j</span> <span class="o">&amp;&amp;</span> <span class="nx">sumValue</span><span class="o">==</span><span class="nx">target</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="nx">i</span><span class="p">,</span> <span class="nx">j</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span> 
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">nums</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">54</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">657</span><span class="p">,</span> <span class="mi">123</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">target</span> <span class="o">:=</span> <span class="mi">125</span>
</span></span><span class="line"><span class="cl">    <span class="nx">indices</span> <span class="o">:=</span> <span class="nf">twoSums</span><span class="p">(</span><span class="nx">nums</span><span class="p">,</span> <span class="nx">target</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">indices</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;No elements in nums that sum up to&#34;</span><span class="p">,</span> <span class="nx">target</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;twoSum() for&#34;</span><span class="p">,</span> <span class="nx">target</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">        <span class="s">&#34;in nums are&#34;</span><span class="p">,</span> <span class="nx">indices</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">target</span> <span class="p">=</span> <span class="mi">34</span>
</span></span><span class="line"><span class="cl">    <span class="nx">indices</span> <span class="p">=</span> <span class="nf">twoSums</span><span class="p">(</span><span class="nx">nums</span><span class="p">,</span> <span class="nx">target</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">indices</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;No elements in nums that sum up to&#34;</span><span class="p">,</span> <span class="nx">target</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;twoSum() for&#34;</span><span class="p">,</span> <span class="nx">target</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">        <span class="s">&#34;in nums are&#34;</span><span class="p">,</span> <span class="nx">indices</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// twoSum() for 125 in nums are [0 5]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// No elements in nums that sum up to 34</span>
</span></span></code></pre></div><h1 id="optimized-solution">Optimized Solution</h1>
<p>We can find both elements with a single loop and a hashmap that will store the elements mapped to their index.</p>
<p align="center"><img src="two-sums-optimized.png" alt="Optimized solution for twoSums problem"></p>
<p>The loop will iterate over the elements in the array, if the <code>difference</code> (<code>target - element</code>) is present in the hashmap the loop will exit otherwise the element will be added to the hashmap.</p>
<h2 id="psuedo-code-for-the-optimized-solution">Psuedo-code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">hashmap = HashMap()
</span></span><span class="line"><span class="cl">loop index in array
</span></span><span class="line"><span class="cl">    difference = target - array[index]
</span></span><span class="line"><span class="cl">    if difference in hashmap
</span></span><span class="line"><span class="cl">        return hashmap[difference], index
</span></span><span class="line"><span class="cl">    else
</span></span><span class="line"><span class="cl">        hashmap[array[index]] = index
</span></span><span class="line"><span class="cl">return none, none
</span></span></code></pre></div><h2 id="time-complexity-analysis-1">Time Complexity Analysis</h2>
<h3 id="best-case-scenario-1">Best Case Scenario</h3>
<p>For the best-case scenario inputs i.e. the first and second elements sum up to the target value, the solution will finish in $O(1)$ time as the loop will always finish after iterating over the first two values.</p>
<h3 id="worst-case-scenario-1">Worst Case Scenario</h3>
<p>In the worst-case scenario, the loop will iterate over all elements to conclude that none of the element pairs sum up to the target value, finishing in $O(n)$ time.</p>
<h2 id="space-complexity-analysis-1">Space Complexity Analysis</h2>
<p>The <code>hashmap</code> used to store elements from the input array will take $O(n)$ additional memory space.</p>
<h2 id="code-for-the-optimized-solution">Code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">twoSums</span><span class="p">(</span><span class="nx">nums</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">target</span> <span class="kt">int</span><span class="p">)([]</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">hashmap</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">index</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">index</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">diff</span> <span class="o">:=</span> <span class="nx">target</span><span class="o">-</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">hashmap</span><span class="p">[</span><span class="nx">diff</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// Difference exists in the hashmap</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="nx">hashmap</span><span class="p">[</span><span class="nx">diff</span><span class="p">],</span> <span class="nx">index</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// Difference does not exist in the hashmap</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// Add the element to hashmap</span>
</span></span><span class="line"><span class="cl">            <span class="nx">hashmap</span><span class="p">[</span><span class="nx">nums</span><span class="p">[</span><span class="nx">index</span><span class="p">]]</span> <span class="p">=</span> <span class="nx">index</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">nums</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">54</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">657</span><span class="p">,</span> <span class="mi">123</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">target</span> <span class="o">:=</span> <span class="mi">125</span>
</span></span><span class="line"><span class="cl">    <span class="nx">indices</span> <span class="o">:=</span> <span class="nf">twoSums</span><span class="p">(</span><span class="nx">nums</span><span class="p">,</span> <span class="nx">target</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">indices</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;No elements in nums that sum up to&#34;</span><span class="p">,</span> <span class="nx">target</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;twoSum() for&#34;</span><span class="p">,</span> <span class="nx">target</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">        <span class="s">&#34;in nums are&#34;</span><span class="p">,</span> <span class="nx">indices</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">target</span> <span class="p">=</span> <span class="mi">34</span>
</span></span><span class="line"><span class="cl">    <span class="nx">indices</span> <span class="p">=</span> <span class="nf">twoSums</span><span class="p">(</span><span class="nx">nums</span><span class="p">,</span> <span class="nx">target</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">indices</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;No elements in nums that sum up to&#34;</span><span class="p">,</span> <span class="nx">target</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;twoSum() for&#34;</span><span class="p">,</span> <span class="nx">target</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">        <span class="s">&#34;in nums are&#34;</span><span class="p">,</span> <span class="nx">indices</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// twoSum() for 125 in nums are [0 5]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// No elements in nums that sum up to 34</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://leetcode.com/problems/two-sum/" target="_blank">1. Two Sum</a><br>
<a href="https://www.youtube.com/watch?v=KLlXCFG5TnA" target="_blank">Two Sum - Leetcode 1 - HashMap - Python</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Identify Anagrams</title>
      <link>http://www.avni.sh/posts/data-structures-and-algorithms/is-anagram/</link>
      <pubDate>Thu, 12 Oct 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/data-structures-and-algorithms/is-anagram/</guid>
      <description>Implementing an isAnagram function that returns true if its two input strings are anagrams and false otherwise</description>
      <content:encoded><![CDATA[<h1 id="problem-statement">Problem Statement</h1>
<p>We have to implement an <code>isAnagram()</code> function that takes two strings as input and returns <code>true</code> if they both are <em>anagrams</em> and false otherwise.</p>
<p>Multiple words could be <strong>anagrams</strong> of each other if they contain the same characters with the same frequency of occurrence.</p>
<p>For word <code>counter</code>:</p>
<ul>
<li><code>trounce</code> is an anagram.</li>
<li><code>trouncee</code> isn&rsquo;t an anagram, because the character <code>e</code> appears twice in <code>trouncee</code>.</li>
<li><code>tounce</code> isn&rsquo;t an anagram, because the character <code>r</code> is missing.</li>
</ul>
<p>The inputs for the <code>isAnagram()</code> function are assumed to be composed of lowercase English characters including whitespace (<code>&quot; &quot;</code>).</p>
<h1 id="brute-force-solution">Brute Force Solution</h1>
<p>The first solution that comes to mind for this problem would be sorting both strings (using the ASCII value of characters) and then comparing the sorted strings by characters.</p>
<p align="center"><img src="sort-strings-compare.png" alt="Best Case scenario for containsDuplicate"></p>
<p>We can preemptively exit the function if both strings are of different lengths as they can&rsquo;t be anagrams.</p>
<h2 id="psuedo-code-for-the-brute-force-solution">Psuedo-code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">if length(string1) != length(string2)
</span></span><span class="line"><span class="cl">	return false
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">string1 = sort(string1)
</span></span><span class="line"><span class="cl">string2 = sort(string2)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">loop index in string1
</span></span><span class="line"><span class="cl">	if string1[index] != string2[index]
</span></span><span class="line"><span class="cl">		return false
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">return true
</span></span></code></pre></div><h2 id="time-complexity-analysis">Time Complexity Analysis</h2>
<h3 id="best-case-scenario">Best Case Scenario</h3>
<p>The best time complexity of a sorting function is $O(n \log(n))$, so the total time complexity of sorting operations is $O(s \log(s)) + O(t \log(t))$ where $s$ and $t$ are the sizes of strings. Since both strings are of the same length (for anagrams) we can generalize time complexity to $O(s \log(s))$.</p>
<p>If the inputs are of different lengths (non-anagrams) then the time complexity of the complete function will be: $O(1)$ as the function will exit preemptively.</p>
<p>Even though we have to compare characters in a loop ($O(s)$) the sorting time will scale relatively slower. Thus, the total time complexity of the best-case scenario will be $O(s \log(s))$.</p>
<h3 id="worst-case-scenario">Worst Case Scenario</h3>
<p>The worst-case scenario for a brute force solution will compare all the characters in sorted strings to find that they aren&rsquo;t anagrams. Its total time complexity will be $2*O(s \log(s)) + O(s)$ but we can generalize it to $O(s \log(s))$.</p>
<h2 id="space-complexity-analysis">Space Complexity Analysis</h2>
<p>The sorting of input strings is performed in-place. Thus, there is no requirement for additional memory space by the brute-force solution and its space complexity will be $O(1)$.</p>
<h2 id="code-for-the-brute-force-solution">Code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;sort&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;strings&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">sortString</span><span class="p">(</span><span class="nx">inputString</span> <span class="kt">string</span><span class="p">)(</span><span class="kt">string</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// The time complexity of this function</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// is assumed to be O(nlog(n))</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// where n is the size of inputString</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="nx">str</span> <span class="o">:=</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">Split</span><span class="p">(</span><span class="nx">inputString</span><span class="p">,</span> <span class="s">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">sort</span><span class="p">.</span><span class="nf">Strings</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">Join</span><span class="p">(</span><span class="nx">str</span><span class="p">,</span> <span class="s">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">isAnagram</span><span class="p">(</span><span class="nx">string1</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">string2</span> <span class="kt">string</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">string1</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="nx">string2</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	  <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="nx">string1</span> <span class="p">=</span> <span class="nf">sortString</span><span class="p">(</span><span class="nx">string1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">string2</span> <span class="p">=</span> <span class="nf">sortString</span><span class="p">(</span><span class="nx">string2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// This loop will have O(n) time complexity</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// where n is the size of string1/string2</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">string1</span><span class="p">);</span><span class="nx">i</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="nx">string1</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">!=</span> <span class="nx">string2</span><span class="p">[</span><span class="nx">i</span><span class="p">]{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">  <span class="nx">string1</span> <span class="o">:=</span> <span class="s">&#34;counter&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">string2</span> <span class="o">:=</span> <span class="s">&#34;trounce&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">string1</span><span class="p">,</span> <span class="s">&#34;is an Anagram of&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">              <span class="nx">string2</span><span class="p">,</span> <span class="s">&#34;:&#34;</span><span class="p">,</span> <span class="nf">isAnagram</span><span class="p">(</span><span class="nx">string1</span><span class="p">,</span> <span class="nx">string2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">string2</span> <span class="p">=</span> <span class="s">&#34;trouncee&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">string1</span><span class="p">,</span> <span class="s">&#34;is an Anagram of&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="nx">string2</span><span class="p">,</span> <span class="s">&#34;:&#34;</span><span class="p">,</span> <span class="nf">isAnagram</span><span class="p">(</span><span class="nx">string1</span><span class="p">,</span> <span class="nx">string2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">string2</span> <span class="p">=</span> <span class="s">&#34;trounc&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">string1</span><span class="p">,</span> <span class="s">&#34;is an Anagram of&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">              <span class="nx">string2</span><span class="p">,</span> <span class="s">&#34;:&#34;</span><span class="p">,</span> <span class="nf">isAnagram</span><span class="p">(</span><span class="nx">string1</span><span class="p">,</span> <span class="nx">string2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// counter is an Anagram of trounce : true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// counter is an Anagram of trouncee : false</span>
</span></span><span class="line"><span class="cl"><span class="c1">// counter is an Anagram of trounc : false</span>
</span></span></code></pre></div><h1 id="optimized-solution">Optimized Solution</h1>
<p>In the brute force solution, the most expensive operation in terms of time complexity is sorting.</p>
<p>To improve on this we can create a hashmap that stores the count of characters appearing in the first string, then we can iterate over the second string and reduce the count for each character in the same hashmap or delete the key. If the hashmap is empty after the loop has ended, then the strings are anagrams.</p>
<p align="center"><img src="hashmap-strings-compare.png" alt="Best Case scenario for containsDuplicate"></p>
<h2 id="psuedo-code-for-the-optimized-solution">Psuedo code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">counter = hashmap()
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">loop char in string1
</span></span><span class="line"><span class="cl">    if char in counter
</span></span><span class="line"><span class="cl">        counter[char] += 1
</span></span><span class="line"><span class="cl">    else
</span></span><span class="line"><span class="cl">        counter[char] = 1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">loop char in string2
</span></span><span class="line"><span class="cl">    if char in counter
</span></span><span class="line"><span class="cl">        if counter[char] == 1
</span></span><span class="line"><span class="cl">            counter.delete(char)
</span></span><span class="line"><span class="cl">        else
</span></span><span class="line"><span class="cl">            counter[char] -= 1
</span></span><span class="line"><span class="cl">    else
</span></span><span class="line"><span class="cl">        return false
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">if counter.empty() == true
</span></span><span class="line"><span class="cl">	return true
</span></span><span class="line"><span class="cl">else
</span></span><span class="line"><span class="cl">	return false
</span></span></code></pre></div><h2 id="time-complexity-analysis-1">Time Complexity Analysis</h2>
<h3 id="best-case-scenario-1">Best Case Scenario</h3>
<p>In the best-case scenario for an optimized solution both strings will be anagram and the time complexity will be $O(s)$ (generalized from $O(s) + O(s)$).</p>
<h3 id="worst-case-scenario-1">Worst Case Scenario</h3>
<p>The time complexity of the worst-case scenario will be the same as the best-case scenario i.e. $O(s)$ but the input strings won&rsquo;t be anagrams.</p>
<h2 id="space-complexity-analysis-1">Space Complexity Analysis</h2>
<p>The <code>counter</code> hashmap will take additional $O(n)$ memory space.</p>
<h2 id="code-for-the-optimized-solution">Code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">isAnagram</span><span class="p">(</span><span class="nx">inputString1</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">inputString2</span> <span class="kt">string</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">inputString1</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="nx">inputString2</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">counter</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Both loops will take O(n) time for completion individually</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// where n is the size of inputString1/inputString2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">inputString1</span><span class="p">);</span><span class="nx">i</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">char</span> <span class="o">:=</span> <span class="nb">string</span><span class="p">(</span><span class="nx">inputString1</span><span class="p">[</span><span class="nx">i</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">counter</span><span class="p">[</span><span class="nx">char</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">counter</span><span class="p">[</span><span class="nx">char</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">counter</span><span class="p">[</span><span class="nx">char</span><span class="p">]</span> <span class="p">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="nx">j</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">j</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">inputString2</span><span class="p">);</span><span class="nx">j</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">char</span> <span class="o">:=</span> <span class="nb">string</span><span class="p">(</span><span class="nx">inputString2</span><span class="p">[</span><span class="nx">j</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="nx">_</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">counter</span><span class="p">[</span><span class="nx">char</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="nx">counter</span><span class="p">[</span><span class="nx">char</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nb">delete</span><span class="p">(</span><span class="nx">counter</span><span class="p">,</span> <span class="nx">char</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span> <span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">counter</span><span class="p">[</span><span class="nx">char</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nx">counter</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">  <span class="nx">string1</span> <span class="o">:=</span> <span class="s">&#34;counter&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">string2</span> <span class="o">:=</span> <span class="s">&#34;trounce&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">string1</span><span class="p">,</span> <span class="s">&#34;is an Anagram of&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">              <span class="nx">string2</span><span class="p">,</span> <span class="s">&#34;:&#34;</span><span class="p">,</span> <span class="nf">isAnagram</span><span class="p">(</span><span class="nx">string1</span><span class="p">,</span> <span class="nx">string2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">string2</span> <span class="p">=</span> <span class="s">&#34;trouncee&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">string1</span><span class="p">,</span> <span class="s">&#34;is an Anagram of&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="nx">string2</span><span class="p">,</span> <span class="s">&#34;:&#34;</span><span class="p">,</span> <span class="nf">isAnagram</span><span class="p">(</span><span class="nx">string1</span><span class="p">,</span> <span class="nx">string2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">string2</span> <span class="p">=</span> <span class="s">&#34;trounc&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">string1</span><span class="p">,</span> <span class="s">&#34;is an Anagram of&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">              <span class="nx">string2</span><span class="p">,</span> <span class="s">&#34;:&#34;</span><span class="p">,</span> <span class="nf">isAnagram</span><span class="p">(</span><span class="nx">string1</span><span class="p">,</span> <span class="nx">string2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// counter is an Anagram of trounce : true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// counter is an Anagram of trouncee : false</span>
</span></span><span class="line"><span class="cl"><span class="c1">// counter is an Anagram of trounc : false</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://leetcode.com/problems/valid-anagram/" target="_blank">242. Valid Anagram</a><br>
<a href="https://www.youtube.com/watch?v=9UtInBqnCgA" target="_blank">Valid Anagram - Leetcode 242 - Python</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Checking an Array for Duplicate Values</title>
      <link>http://www.avni.sh/posts/data-structures-and-algorithms/contains-duplicate/</link>
      <pubDate>Tue, 10 Oct 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/data-structures-and-algorithms/contains-duplicate/</guid>
      <description>Implementing a containsDuplicate function that returns true if there are duplicate elements present in the array and false otherwise</description>
      <content:encoded><![CDATA[<h1 id="problem-statement">Problem Statement</h1>
<p>We have to implement a function <code>containsDuplicate()</code> that takes an integer array as input and returns <code>true</code> if an element occurs more than once and <code>false</code> otherwise.</p>
<h1 id="brute-force-solution">Brute Force Solution</h1>
<p>The simplest solution for this problem would be two nested loops, where the first loop will select an element and the second loop will select another element from the array and compare them. On the first occurrence of a duplicate element, the function will exit while returning <code>true</code>.</p>
<h2 id="psuedo-code-for-the-brute-force-solution">Psuedo Code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">loop index1 in array
</span></span><span class="line"><span class="cl">    loop index2 in array
</span></span><span class="line"><span class="cl">        if index1!=index2 and array[index1]==array[index2]
</span></span><span class="line"><span class="cl">            return true
</span></span><span class="line"><span class="cl">return false
</span></span></code></pre></div><h2 id="time-complexity-analysis">Time Complexity Analysis</h2>
<h3 id="best-case-scenario">Best Case Scenario</h3>
<p>The best-case scenario for the brute-force solution would be when the first and second elements are duplicated. In this scenario, the outer and inner loop will execute only once so the time complexity will be $O(1)$.</p>
<p align="center"><img src="contains-duplicate-best-case.png" alt="Best Case scenario for containsDuplicate"></p>
<h3 id="worst-case-scenario">Worst Case Scenario</h3>
<p>If all the elements in the array are unique then the brute-force algorithm will take $O(n^2)$ time for completion, where $n$ is the size of the array.</p>
<p align="center"><img src="contains-duplicate-worst-case.png" alt="Worst Case scenario for containsDuplicate"></p>
<h2 id="space-complexity-analysis">Space Complexity Analysis</h2>
<p>Since the brute-force solution does not use any data structures other than the input array, its space complexity will be $O(1)$.</p>
<h2 id="code-for-the-brute-force-solution">Code for the Brute Force Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">containsDuplicate</span><span class="p">(</span><span class="nx">nums</span> <span class="p">[]</span><span class="kt">int</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">i</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">j</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">j</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">j</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// Checking if the element selected by index j</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// is not the same as the outer loop</span>
</span></span><span class="line"><span class="cl">			
</span></span><span class="line"><span class="cl">            <span class="c1">// If the value of both elements is the same</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// then exit the function with the value true </span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="nx">i</span><span class="o">!=</span><span class="nx">j</span> <span class="o">&amp;&amp;</span> <span class="nx">nums</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span><span class="o">==</span><span class="nx">nums</span><span class="p">[</span><span class="nx">j</span><span class="p">]{</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">  <span class="nx">inputArray</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">1</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Array:&#34;</span><span class="p">,</span> <span class="nx">inputArray</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="s">&#34;containsDuplicate: &#34;</span><span class="p">,</span> <span class="nf">containsDuplicate</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">inputArray</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Array:&#34;</span><span class="p">,</span> <span class="nx">inputArray</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="s">&#34;containsDuplicate: &#34;</span><span class="p">,</span> <span class="nf">containsDuplicate</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Array: [1 2 4 5 6 1] containsDuplicate:  true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Array: [1 2 3 4] containsDuplicate:  false</span>
</span></span></code></pre></div><h1 id="optimized-solution">Optimized Solution</h1>
<p>Instead of iterating the array for each element selected by the outer loop, we can store all the elements inside a <a href="/posts/computer-science/interview-preparation/arrays-strings-hashmaps/#hashmaps" target="_blank">HashMap</a>. If the element is already present in HashMap, then we have encountered a duplicate and we can exit the function with the value <code>true</code>.</p>
<h2 id="psuedo-code-for-the-optimized-solution">Psuedo Code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">hashmap = {}
</span></span><span class="line"><span class="cl">loop value in array
</span></span><span class="line"><span class="cl">    if hashmap.get(value)
</span></span><span class="line"><span class="cl">        return true
</span></span><span class="line"><span class="cl">    else
</span></span><span class="line"><span class="cl">        hashmap[value] = 1
</span></span><span class="line"><span class="cl">return false
</span></span></code></pre></div><h2 id="time-complexity-analysis-1">Time Complexity Analysis</h2>
<h3 id="best-case-scenario-1">Best Case Scenario</h3>
<p>The best case scenario for the optimized solution is the same as the brute-force solution i.e. first and second elements are duplicated resulting in constant ($O(1)$) runtime.</p>
<h3 id="worst-case-scenario-1">Worst Case Scenario</h3>
<p>If the input array contains unique elements, then the optimized solution will iterate over the complete array adding each element to HashMap but the time complexity of completing this would still be $O(n)$ which is much better than brute force solution ($O(n^2)$).</p>
<h2 id="space-complexity-analysis-1">Space Complexity Analysis</h2>
<p>The hashmap in the optimized solution will use extra $O(n)$ memory space.</p>
<h2 id="code-for-the-optimized-solution">Code for the Optimized Solution</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">containsDuplicate</span><span class="p">(</span><span class="nx">nums</span> <span class="p">[]</span><span class="kt">int</span><span class="p">)(</span><span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">hashmap</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span><span class="nx">i</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// Check if a value at key exists in the hashmap</span>
</span></span><span class="line"><span class="cl">        <span class="nx">value</span><span class="p">,</span> <span class="nx">key_exists</span> <span class="o">:=</span> <span class="nx">hashmap</span><span class="p">[</span><span class="nx">nums</span><span class="p">[</span><span class="nx">i</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nx">key_exists</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// If the value exists then exit the function</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// If the value does not exist</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// add it to the hashmap</span>
</span></span><span class="line"><span class="cl">            <span class="nx">hashmap</span><span class="p">[</span><span class="nx">nums</span><span class="p">[</span><span class="nx">i</span><span class="p">]]</span> <span class="p">=</span> <span class="nx">value</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">  <span class="nx">inputArray</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">1</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Array:&#34;</span><span class="p">,</span> <span class="nx">inputArray</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="s">&#34;containsDuplicate: &#34;</span><span class="p">,</span> <span class="nf">containsDuplicate</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">inputArray</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Array:&#34;</span><span class="p">,</span> <span class="nx">inputArray</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="s">&#34;containsDuplicate: &#34;</span><span class="p">,</span> <span class="nf">containsDuplicate</span><span class="p">(</span><span class="nx">inputArray</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Array: [1 2 4 5 6 1] containsDuplicate:  true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Array: [1 2 3 4] containsDuplicate:  false</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://leetcode.com/problems/contains-duplicate/" target="_blank">217. Contains Duplicate</a><br>
<a href="https://www.youtube.com/watch?v=3OamzN90kPg" target="_blank">Contains Duplicate - Leetcode 217 - Python</a></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
