<?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>Data Structures and Algorithms on avni.sh</title>
    <link>http://www.avni.sh/series/data-structures-and-algorithms/</link>
    <description>Recent content in Data Structures and Algorithms 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 -- 0.146.0</generator>
    <language>en</language>
    <lastBuildDate>Thu, 15 Feb 2024 00:00:00 +0000</lastBuildDate>
    <atom:link href="http://www.avni.sh/series/data-structures-and-algorithms/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Reorder Linked Lists</title>
      <link>http://www.avni.sh/posts/computer-science/interview-preparation/reorder-linked-list/</link>
      <pubDate>Thu, 15 Feb 2024 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/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.png" 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.png" 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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span><span class="lnt">121
</span><span class="lnt">122
</span><span class="lnt">123
</span><span class="lnt">124
</span><span class="lnt">125
</span><span class="lnt">126
</span><span class="lnt">127
</span><span class="lnt">128
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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.png" 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.png" 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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<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/computer-science/interview-preparation/merge-sorted-linked-lists/</link>
      <pubDate>Mon, 29 Jan 2024 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/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.png" 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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<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/computer-science/interview-preparation/reverse-linked-lists/</link>
      <pubDate>Fri, 26 Jan 2024 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<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>Two-Pointer Approach</title>
      <link>http://www.avni.sh/posts/computer-science/interview-preparation/two-pointers-approach/</link>
      <pubDate>Tue, 23 Jan 2024 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/two-pointers-approach/</guid>
      <description>The two-pointer approach provides an efficient alternative for solving problems related to substrings, subarrays, and sequences.</description>
      <content:encoded><![CDATA[<p>To solve problems like <a href="/posts/computer-science/interview-preparation/two-sums/" target="_blank">Two Sums</a>,
<a href="/posts/computer-science/interview-preparation/product-except-self/" target="_blank">Product Except Self</a>, or
<a href="/posts/computer-science/interview-preparation/contains-duplicate/" target="_blank">Contains Duplicate</a> we have to
access multiple values at the same time from a sequential data structure (for example, a
<a href="/posts/computer-science/interview-preparation/linked-lists/" target="_blank">Linked List</a> or an
<a href="/posts/computer-science/interview-preparation/arrays-strings-hashmaps/#arrays" target="_blank">Array</a>).</p>
<p>The initial instinct while solving these problems is to use nested loops where each layer
of the loop will maintain a different iterator on the data structure. But this
approach does not scale well with the size of input as a single
order of nested loops has $O(n^2)$ worst-case time complexity.</p>
<p>To implement a scalable solution we have to avoid nesting and access multiple values
in a single loop by maintaining two iterators. We can use this <em>two-pointer</em> approach
to solve the <strong>Two Sums</strong> problem (assuming the input is sorted).</p>
<p align="center"><img src="two-pointers-two-sum.png" alt="Two Pointer Approach for solving the Two Sums Problem"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">startPointer = 0
</span></span><span class="line"><span class="cl">endPointer = length(array)-1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">while(startPointer&lt;endPointer){
</span></span><span class="line"><span class="cl">  sumValue = array
</span></span><span class="line"><span class="cl">  if(sumValue==target){
</span></span><span class="line"><span class="cl">    return (startPointer, endPointer)
</span></span><span class="line"><span class="cl">  }
</span></span><span class="line"><span class="cl">  else if (sumValue&lt;target){
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    // Since the sumValue is small we have
</span></span><span class="line"><span class="cl">    // to increment the startPointer to a 
</span></span><span class="line"><span class="cl">    // larger value
</span></span><span class="line"><span class="cl">    startPointer += 1
</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">
</span></span><span class="line"><span class="cl">    // Since the sumValue is larger we have
</span></span><span class="line"><span class="cl">    // to decrement the endPointer to a 
</span></span><span class="line"><span class="cl">    // smaller value
</span></span><span class="line"><span class="cl">    endPointer -= 1
</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">
</span></span><span class="line"><span class="cl">return none, none
</span></span></code></pre></td></tr></table>
</div>
</div><p>Unlike the <a href="/posts/computer-science/interview-preparation/two-sums/#brute-force-solution" target="_blank">brute-force solution to two sums</a> problem which uses nested loops to
return results in quadratic time ($O(n^2)$), this approach will return results
in linear time ($O(1)$) while also maintaining a constant space complexity.</p>
<h1 id="fast-slow-pointers">Fast-Slow Pointers</h1>
<p>The pointers can also iterate the data structure at an independent pace. For example,
a <em>fast</em> pointer can iterate over two or more values at a time whereas a <em>slow</em>
pointer can iterate over a single value at a time.</p>
<h2 id="finding-the-middle-node-of-a-linked-list">Finding the middle node of a Linked List</h2>
<p>Assume that we have to find the middle node of a Linked List. The Linked List
is a dynamically allocated data structure so its size could not be determined without
iterating it once completely. So a loop with $O(n)$ time complexity will be executed
on the linked list to determine its length $n$, then a second loop with $O(n/2)$ time
complexity will be executed to fetch the middle node. This will result in the total
time complexity of $O(n) + O(n/2)$ in the worst-case scenario.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">// Finding the length of the linked list
</span></span><span class="line"><span class="cl">linked_list_length = 1
</span></span><span class="line"><span class="cl">temp = linked_list.head
</span></span><span class="line"><span class="cl">while(temp.next != nil){
</span></span><span class="line"><span class="cl"> temp = temp.next 
</span></span><span class="line"><span class="cl"> linked_list_length += 1
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">// Iterating over the linked list until
</span></span><span class="line"><span class="cl">// the middle node
</span></span><span class="line"><span class="cl">middle_node_location = linked_list_length/2 
</span></span><span class="line"><span class="cl">temp = linked_list.head
</span></span><span class="line"><span class="cl">i=0
</span></span><span class="line"><span class="cl">while(i&lt;middle_node_location){
</span></span><span class="line"><span class="cl">  temp=temp.next
</span></span><span class="line"><span class="cl">  i+=1
</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 temp
</span></span></code></pre></td></tr></table>
</div>
</div><p align="center"><img src="middle-node.png" alt="Finding the middle node of a linked list"></p>
<p>But we can reduce the time complexity of the solution to just $O(n)$ if we use a fast and
a slow pointer to iterate over the linked list simultaneously. The slow pointer will
iterate over every node in the linked list whereas the fast pointer will skip over every other node.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<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">
</span></span><span class="line"><span class="cl">while(fast!=nil) or (fast.next!=nil){
</span></span><span class="line"><span class="cl">  // fast will skip over every other node
</span></span><span class="line"><span class="cl">  fast = fast.next.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  // slow will iterate the linked list
</span></span><span class="line"><span class="cl">  // one node at a time
</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">return slow
</span></span></code></pre></td></tr></table>
</div>
</div><p align="center"><img src="two-pointers-middle-node.png" alt="Finding the middle node of a linked list using two-pointer approach"></p>
<p>Since the fast pointer covers twice the distance as the slow pointer in the same number of
iterations when it reaches the end of the linked list the slow pointer would be at the middle node.</p>
<h1 id="sliding-window">Sliding Window</h1>
<p>Some problems require analysis of sub-sequences of a data structure. Instead
of iterating the data structure one value at a time, we can define a <em>window</em> and move
it by one value on every iteration i.e. value/pattern identified from the previous window
would be reused with the new element to analyze the current window, eliminating redundancy.</p>
<p align="center"><img src="sliding-window.png" alt="Sliding Window approach"></p>
<p>Depending on the problem, the window size could be static (constant on every iteration) or
dynamic (variable on every iteration).</p>
<h2 id="static-window-size">Static Window Size</h2>
<p>If the subsequence size defined in the problem is static then the sliding window size
will also be constant.</p>
<h3 id="calculating-moving-average">Calculating Moving Average</h3>
<p>The <strong>Moving Average / Rolling Mean</strong> is the mean calculated over a window of values with a constant size.</p>
<p>For example, 30 days moving average, 5 months moving average, etc.</p>
<p>$$Mean(a_1, a_2, a_3, a_4, a_5)={(a_1+a_2+a_3+a_4+a_5) \over 5}$$
$$Mean_{Rolling}(a_1, a_2, a_3, \dots , a_n, 3)=Mean(a_1, a_2, a_3),\ Mean(a_2, a_3, a_4),\newline Mean(a_3, a_4, a_5),\ \dots,\ Mean(a_{n-2}, a_{n-1}, a_{n})$$</p>
<p>If we have to calculate the moving average of values over the data provided in the
form of an array. We can implement a brute force solution that will use
a nested loop of window size $k$ and calculate the individual averages.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">func calculate_moving_average(array, k)
</span></span><span class="line"><span class="cl">  moving_averages = []
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  for index in array
</span></span><span class="line"><span class="cl">    moving_sum = 0
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    for index2 in range(0, k)
</span></span><span class="line"><span class="cl">      // Calculating the sum of the current window
</span></span><span class="line"><span class="cl">      moving_sum += array[index+index2]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    // Appending the average from the current window 
</span></span><span class="line"><span class="cl">    // to the moving average list 
</span></span><span class="line"><span class="cl">    moving_averages.append(moving_sum/k)
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  return moving_averages
</span></span></code></pre></td></tr></table>
</div>
</div><p>This approach will result in the total time complexity of $O(kn)$ where $k$ is the size
of the window and $n$ is the number of elements in the array.</p>
<p>By using a sliding window of size $k$ (the moving average window size) we can
eliminate the nested loop from the solution and decrease the total time
complexity to $O(n)$.</p>
<p>We know the formula for calculating the mean over the window of the first 3 values is
$$Mean(a_1, a_2, a_3)={(a_1+a_2+a_3) \over 3}$$</p>
<p>Instead of calculating the next rolling mean from scratch, we can use the value of
$Mean(a_1, a_2, a_3)$ by adding the value of the element introduced in this window
and subtracting the value of the element from the previous window (divided by the
window size).</p>
<p>$$Mean(a_2, a_3, a_4) = {{a_2 + a_3 + a_4} \over 3}$$
$$Mean(a_2, a_3, a_4) = {{a_2 + a_3 + a_4 + a_1 - a_1} \over 3}$$
$$Mean(a_2, a_3, a_4) = {{a_1 + a_2 + a_3} \over 3} + {a_4 \over 3} - {a_1 \over 3}$$
$$Mean(a_2, a_3, a_4) = {{a_1 + a_2 + a_3} \over 3} + {{a_4 - a_1} \over 3}$$
$$Mean(a_2, a_3, a_4) = Mean(a_1, a_2, a_3) + {{a_4 - a_1} \over 3}$$</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">func average(values)
</span></span><span class="line"><span class="cl">  return sum(values)/length(values)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">func calculate_moving_average(array, k)
</span></span><span class="line"><span class="cl">  moving_averages = []
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  // Calculating the average value of the 
</span></span><span class="line"><span class="cl">  // first window
</span></span><span class="line"><span class="cl">  temp_average = average(array[:k])
</span></span><span class="line"><span class="cl">  moving_averages.append(temp_average)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  for index in range(k, length(array))
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    // Using the average value from the 
</span></span><span class="line"><span class="cl">    // previous window to calculate the average 
</span></span><span class="line"><span class="cl">    // value of the current window
</span></span><span class="line"><span class="cl">    temp_average = temp_average + (array[index] + array[index-k])/k
</span></span><span class="line"><span class="cl">    moving_averages.append(temp_average)
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  return moving_averages
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="dynamic-window-size">Dynamic Window Size</h2>
<p>Finding the largest/smallest subsequence satisfying a particular condition inside an array
or string requires us to work with an unknown window size. In such cases, to apply the sliding
window approach we have to maintain a start and an end pointer, updated dynamically while
iterating over the data structure.</p>
<h3 id="finding-the-sub-array-that-sum-up-to-a-target-value">Finding the sub-array that sum up to a target value</h3>
<p>Given a sorted array of positive integers as input, we have to find the first sub-array
that sums up to a target value.</p>
<p>Since the length of the sub-array is unknown
we have to create a dynamically sized window and calculate the sum of its elements.
If the sum is smaller than the target value then we will increase the window size from
the end and if the window sum is larger than the target value then we decrease its size
from the beginning. This cycle will be repeated until we have found the sub-array.</p>
<p align="center"><img src="dynamic-sliding-window.png" alt="Dynamic Sliding Window approach"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">func calculate_sum(array, start, end)
</span></span><span class="line"><span class="cl">  sum = 0
</span></span><span class="line"><span class="cl">  for index in [start, end]
</span></span><span class="line"><span class="cl">    sum += array[index]
</span></span><span class="line"><span class="cl">  return sum
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">func find_subarray(array, target)
</span></span><span class="line"><span class="cl">  start = 0 
</span></span><span class="line"><span class="cl">  end = 0
</span></span><span class="line"><span class="cl">  while(end&lt;len(array))
</span></span><span class="line"><span class="cl">    window_sum = calculate_sum(array, start, end)
</span></span><span class="line"><span class="cl">    if window_sum &lt; target:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      // If the sum of the current window
</span></span><span class="line"><span class="cl">      // is smaller than the target value
</span></span><span class="line"><span class="cl">      // then increase the window size from 
</span></span><span class="line"><span class="cl">      // the end
</span></span><span class="line"><span class="cl">      end += 1
</span></span><span class="line"><span class="cl">    else if window_sum &gt; target:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      // If the sum of the current window
</span></span><span class="line"><span class="cl">      // is larger than the target value
</span></span><span class="line"><span class="cl">      // then decrease the window size from 
</span></span><span class="line"><span class="cl">      // the start
</span></span><span class="line"><span class="cl">      start += 1
</span></span><span class="line"><span class="cl">    else:
</span></span><span class="line"><span class="cl">      return start, end
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  return nil, nil
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<h1 id="resources">Resources</h1>
<p><a href="https://usaco.guide/silver/two-pointers?lang=cpp" target="_blank">Two Pointers</a><br>
<a href="https://github.com/Chanda-Abdul/Several-Coding-Patterns-for-Solving-Data-Structures-and-Algorithms-Problems-during-Interviews/blob/main/%E2%9C%85%20%20Pattern%2001%20%3A%20Sliding%20Window.md" target="_blank">Sliding Window</a><br>
<a href="https://en.wikipedia.org/wiki/Moving_average" target="_blank">Moving Average</a><br>
<a href="https://www.youtube.com/watch?v=GcW4mgmgSbw" target="_blank">Solve subarray problems FASTER (using Sliding Windows)</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Linked Lists</title>
      <link>http://www.avni.sh/posts/computer-science/interview-preparation/linked-lists/</link>
      <pubDate>Fri, 17 Nov 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/linked-lists/</guid>
      <description>A Linked List uses dynamic allocation of memory to store sequential data</description>
      <content:encoded><![CDATA[<p>The linked list data structure is used to store sequential data using <em>nodes</em>. A <strong>node</strong> contains a value and the memory address of the next node.</p>
<p align="center"><img src="linked-list.png" alt="Linked List"></p>
<p>Memory for a new node is allocated dynamically i.e. nodes are stored in the next available memory location. Unlike <a href="/posts/computer-science/interview-preparation/arrays-strings-hashmaps/#arrays" target="_blank">arrays</a> where contiguous blocks of memory are allocated during declaration.</p>
<p>The first element in a linked list is marked by its <em>head</em> pointer.</p>
<p>Here is an implementation of Linked List in <a href="/posts/go/go-programming-language/" target="_blank">Go</a></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Node</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Integer value</span>
</span></span><span class="line"><span class="cl">  <span class="nx">value</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">// Pointer to the next node</span>
</span></span><span class="line"><span class="cl">  <span class="nx">next</span> <span class="o">*</span><span class="nx">Node</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">type</span> <span class="nx">LinkedList</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Pointer to the head node</span>
</span></span><span class="line"><span class="cl">  <span class="nx">head</span> <span class="o">*</span><span class="nx">Node</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h1 id="linked-list-operations">Linked List Operations</h1>
<h2 id="accessing-a-value">Accessing a Value</h2>
<p>In arrays, we can access an element using its index. For linked lists we have to iterate over all the previous elements to reach the element specified by the index, so to access the 7th element in a linked list we have to iterate over the first 6 elements.</p>
<p align="center"><img src="linked-list-access.png" alt="Accessing a value in a Linked List"></p>
<p>This operation has linear time complexity ($O(n)$) in the worst-case scenario (accessing the last element).</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span></code></pre></td>
<td class="lntd">
<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">Node</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">value</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">Node</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">type</span> <span class="nx">LinkedList</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">head</span> <span class="o">*</span><span class="nx">Node</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">// Creating a LinkedList and its head node</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">linkedList</span> <span class="nx">LinkedList</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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">// Accessing the head of LinkedList</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;Head node of the linked list:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Adding a new nodes after head</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">7</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">8</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">9</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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">// Accessing the node at a specific location</span>
</span></span><span class="line"><span class="cl">    <span class="nx">index</span> <span class="o">:=</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Iterator variable to store the current node</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">temp</span> <span class="o">*</span><span class="nx">Node</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Starting from head</span>
</span></span><span class="line"><span class="cl">    <span class="nx">temp</span> <span class="p">=</span> <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Until the value of the index is 0</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// increment the temp to the next node</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">&gt;</span><span class="mi">0</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">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></span><span class="line"><span class="cl">    <span class="c1">// Display the value at the index</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;Value at index&#34;</span><span class="p">,</span> <span class="nx">index</span><span class="p">,</span> <span class="s">&#34;is:&#34;</span><span class="p">,</span> <span class="nx">temp</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></code></pre></td></tr></table>
</div>
</div><h2 id="inserting-an-element">Inserting an Element</h2>
<p>Before we insert an element in a linked list, we have to allocate memory for the new node.</p>
<h3 id="inserting-an-element-at-the-beginning">Inserting an Element (at the beginning)</h3>
<p>The first element in a linked list is decided by the value of the <em>head</em> pointer. So we can reassign the <code>head</code> to point to a new node containing the value to be inserted.</p>
<p align="center"><img src="linked-list-insert-start.png" alt="Inserting a value at the start of a Linked List"></p>
<p>Since we are only modifying the head of the linked list, this is a constant time complexity ($O(1)$) operation.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span></code></pre></td>
<td class="lntd">
<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">Node</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">value</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">Node</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">type</span> <span class="nx">LinkedList</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">head</span> <span class="o">*</span><span class="nx">Node</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="p">(</span><span class="nx">ll</span> <span class="o">*</span><span class="nx">LinkedList</span><span class="p">)</span> <span class="nf">insertAtBeginning</span><span class="p">(</span><span class="nx">input</span> <span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Create a new node with the input value</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span> <span class="nx">input</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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">// Set the current head of the linked list </span>
</span></span><span class="line"><span class="cl">    <span class="c1">// as the next node</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="p">(</span><span class="nx">ll</span><span class="p">.</span><span class="nx">head</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Point the head to newNode</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ll</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</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">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">linkedList</span> <span class="nx">LinkedList</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">7</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">8</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">9</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Head node of the linked list:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;2nd node of the linked list:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</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;3rd node of the linked list:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</span><span class="p">.</span><span class="nx">next</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nf">insertAtBeginning</span><span class="p">(</span><span class="mi">90</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;After inserting a new element at the start of the Linked List&#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;Head node of the linked list:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;2nd node of the linked list:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</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;3rd node of the linked list:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</span><span class="p">.</span><span class="nx">next</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">// Head node of the linked list: {2 0xc00009e240}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2nd node of the linked list: {7 0xc00009e250}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3rd node of the linked list: {8 0xc00009e260}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// After inserting a new element at the start of the Linked List</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Head node of the linked list: {90 0xc00009e230}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2nd node of the linked list: {2 0xc00009e240}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3rd node of the linked list: {7 0xc00009e250}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="inserting-an-element-at-the-end">Inserting an Element (at the end)</h3>
<p>To insert an element at the end of a linked list we first have to find the last element. For that, we have to iterate over the complete list, which will take $O(n)$ time.</p>
<p align="center"><img src="linked-list-insert-end.png" alt="Inserting a value at the end of a Linked List"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span></code></pre></td>
<td class="lntd">
<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">Node</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">value</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">Node</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">type</span> <span class="nx">LinkedList</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">head</span> <span class="o">*</span><span class="nx">Node</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="p">(</span><span class="nx">ll</span> <span class="o">*</span><span class="nx">LinkedList</span><span class="p">)</span> <span class="nf">insertAtEnd</span><span class="p">(</span><span class="nx">input</span> <span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Assigning a temp pointer to the head 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">ll</span><span class="p">.</span><span class="nx">head</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Until we reach the node with no next value</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></span><span class="line"><span class="cl">        <span class="c1">// Increment temp to the next node in the linked list</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></span><span class="line"><span class="cl">    <span class="c1">// Add a new node to the linked list</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="nx">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span> <span class="nx">input</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</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="kd">var</span> <span class="nx">linkedList</span> <span class="nx">LinkedList</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">7</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Head node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;2nd node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nf">insertAtEnd</span><span class="p">(</span><span class="mi">90</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;After inserting a new element at the end of the Linked List&#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;Head node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;2nd node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</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;3rd node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</span><span class="p">.</span><span class="nx">next</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nf">insertAtEnd</span><span class="p">(</span><span class="mi">91</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;4th node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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></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">// Head node: {2 0xc000014270}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2nd node: {7 &lt;nil&gt;}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// After inserting a new element at the end of the Linked List</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Head node: {2 0xc000014270}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2nd node: {7 0xc0000142a0}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3rd node: {90 &lt;nil&gt;}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 4th node: {91 &lt;nil&gt;}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>If we modify the <code>LinkedList</code> data structure to add a <code>tail</code> pointer (to store the address of the last node), the time taken to complete this operation will be reduced to $O(1)$.</p>
<h3 id="inserting-an-element-at-a-specific-location">Inserting an Element (at a specific location)</h3>
<p>To insert an element at a specific location in a linked list, we can use the same approach as <code>insertAtEnd</code> but we have to stop the loop just before we reach the specified location.</p>
<p align="center"><img src="linked-list-insert-index.png" alt="Inserting a value at a specific location in a Linked List"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span></code></pre></td>
<td class="lntd">
<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">Node</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">value</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">Node</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">type</span> <span class="nx">LinkedList</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">head</span> <span class="o">*</span><span class="nx">Node</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="p">(</span><span class="nx">ll</span> <span class="o">*</span><span class="nx">LinkedList</span><span class="p">)</span> <span class="nf">insertAtIndex</span><span class="p">(</span><span class="nx">input</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">index</span> <span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Creating a new node with the input value</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="nx">input</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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="k">if</span> <span class="nx">index</span><span class="o">==</span><span class="mi">0</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// Same as inserting a new node at the beginning</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">ll</span><span class="p">.</span><span class="nx">head</span>
</span></span><span class="line"><span class="cl">        <span class="nx">ll</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</span> <span class="nx">newNode</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 class="c1">// Starting temp iterator from the head 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">ll</span><span class="p">.</span><span class="nx">head</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// While temp is not at the end </span>
</span></span><span class="line"><span class="cl">        <span class="c1">// AND i is smaller than the index</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// Increment the temp to the next node</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">1</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="nx">index</span> <span class="o">&amp;&amp;</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 class="nx">i</span><span class="o">++</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></span><span class="line"><span class="cl">        <span class="c1">// Insert newNode in between temp and temp.next</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// temp -&gt; newNode -&gt; temp.next</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">temp</span><span class="p">.</span><span class="nx">next</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">newNode</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">linkedList</span> <span class="nx">LinkedList</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">7</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Head node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;2nd node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nf">insertAtIndex</span><span class="p">(</span><span class="mi">90</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;After inserting a new element at 0th index&#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;Head node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nf">insertAtIndex</span><span class="p">(</span><span class="mi">91</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;After inserting a new element at 1st index&#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;Head node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;2nd node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</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;3rd node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</span><span class="p">.</span><span class="nx">next</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;4th node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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></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">// Head node: {2 0xc000014280}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2nd node: {7 &lt;nil&gt;}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// After inserting a new element at 0th index</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Head node: {90 0xc000014270}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// After inserting a new element at 1st index</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Head node: {90 0xc0000142d0}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2nd node: {91 0xc000014270}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3rd node: {2 0xc000014280}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 4th node: {7 &lt;nil&gt;}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>The worst-case time complexity of this operation is $O(n)$.</p>
<h2 id="deleting-an-element">Deleting an Element</h2>
<p>We can remove an element from the linked list if we just reassign the pointers storing its location.</p>
<h3 id="deleting-an-element-from-the-beginning">Deleting an Element (from the beginning)</h3>
<p>To delete an element from the beginning we can just change the address stored in the <code>head</code> pointer to the next node.</p>
<p align="center"><img src="linked-list-delete-start.png" alt="Deleting a value from the start of a Linked List"></p>
<p>The time taken to complete this operation is independent of the size of the linked list, thus the time complexity will be $O(1)$.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span></code></pre></td>
<td class="lntd">
<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">Node</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">value</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">Node</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">type</span> <span class="nx">LinkedList</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">head</span> <span class="o">*</span><span class="nx">Node</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="p">(</span><span class="nx">ll</span> <span class="o">*</span><span class="nx">LinkedList</span><span class="p">)</span> <span class="nf">deleteFromStart</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Linked List&#39;s head will now point to the next node</span>
</span></span><span class="line"><span class="cl">    <span class="nx">ll</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</span> <span class="nx">ll</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="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">linkedList</span> <span class="nx">LinkedList</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Head node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="nx">linkedList</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Second node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nf">deleteFromStart</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;After deleting element from the start&#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;Head node:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">// Head node: {2 0xc00009e230}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Second node: {3 &lt;nil&gt;}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// After deleting element from the start</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Head node: {3 &lt;nil&gt;}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="deleting-an-element-from-the-end">Deleting an Element (from the end)</h3>
<p>To delete an element from the end of a linked list we have to iterate over all the preceding elements. This will result in the worst-case time complexity of $O(n)$.</p>
<p align="center"><img src="linked-list-delete-end.png" alt="Deleting a value from the end of a Linked List"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span></code></pre></td>
<td class="lntd">
<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">Node</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">value</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">Node</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">type</span> <span class="nx">LinkedList</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">head</span> <span class="o">*</span><span class="nx">Node</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="p">(</span><span class="nx">ll</span> <span class="o">*</span><span class="nx">LinkedList</span><span class="p">)</span> <span class="nf">deleteFromEnd</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">ll</span><span class="p">.</span><span class="nx">head</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">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></span><span class="line"><span class="cl">        <span class="c1">// If the linked list contains only one element</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// Set the value of the head to nil</span>
</span></span><span class="line"><span class="cl">        <span class="nx">ll</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</span> <span class="kc">nil</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">// Iterate over the linked list until you reach</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// the second last element</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="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></span><span class="line"><span class="cl">        <span class="c1">// Set the next value of the second last element to nil</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="kc">nil</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">linkedList</span> <span class="nx">LinkedList</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Head node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Second node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nf">deleteFromEnd</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;After deleting element from the end&#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;Head node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Second node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</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">// Head node: &amp;{2 0xc000014280}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Second node: &amp;{3 &lt;nil&gt;}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// After deleting element from the end</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Head node: &amp;{2 &lt;nil&gt;}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Second node: &lt;nil&gt;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="deleting-an-element-from-a-specific-location">Deleting an Element (from a specific location)</h3>
<p>Similar to <code>insertAtIndex</code> we will iterate over the linked list and stop just before the specified location to change the references for its <code>next</code> pointer.</p>
<p align="center"><img src="linked-list-delete-index.png" alt="Deleting a value from a specific location in a Linked List"></p>
<p>In the worst-case scenario for this operation, we have to remove the last element, resulting in $O(n)$ time complexity.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span><span class="lnt">71
</span><span class="lnt">72
</span><span class="lnt">73
</span><span class="lnt">74
</span><span class="lnt">75
</span></code></pre></td>
<td class="lntd">
<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">Node</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">value</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">Node</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">type</span> <span class="nx">LinkedList</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">head</span> <span class="o">*</span><span class="nx">Node</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="p">(</span><span class="nx">ll</span> <span class="o">*</span><span class="nx">LinkedList</span><span class="p">)</span> <span class="nf">deleteFromIndex</span><span class="p">(</span><span class="nx">index</span> <span class="kt">int</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">ll</span><span class="p">.</span><span class="nx">head</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="mi">0</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 have to remove the first node (head)</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// then change its reference to the next node</span>
</span></span><span class="line"><span class="cl">        <span class="nx">ll</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</span> <span class="nx">ll</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></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 loop at the second last element or </span>
</span></span><span class="line"><span class="cl">        <span class="c1">// at index-1</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">1</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="nx">index</span> <span class="o">&amp;&amp;</span> <span class="nx">temp</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 class="nx">i</span><span class="o">++</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></span><span class="line"><span class="cl">        <span class="c1">// Change the reference of the next pointer </span>
</span></span><span class="line"><span class="cl">        <span class="c1">// to skip the node located at index</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">temp</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="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">linkedList</span> <span class="nx">LinkedList</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span> <span class="mi">9</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Head node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Second node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</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;Third node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</span><span class="p">.</span><span class="nx">next</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;Fourth node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">removalIndex</span> <span class="o">:=</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nf">deleteFromIndex</span><span class="p">(</span><span class="nx">removalIndex</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;After deleting element from index:&#34;</span><span class="p">,</span> <span class="nx">removalIndex</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;Head node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Second node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</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;Third node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</span><span class="p">.</span><span class="nx">next</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;Fourth node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">removalIndex</span> <span class="p">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nf">deleteFromIndex</span><span class="p">(</span><span class="nx">removalIndex</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;After deleting element from index:&#34;</span><span class="p">,</span> <span class="nx">removalIndex</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;Head node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Second node:&#34;</span><span class="p">,</span> <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">next</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">// Head node: &amp;{2 0xc00009e240}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Second node: &amp;{3 0xc00009e250}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Third node: &amp;{5 0xc00009e260}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Fourth node: &amp;{9 &lt;nil&gt;}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// After deleting element from index: 2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Head node: &amp;{2 0xc00009e240}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Second node: &amp;{3 0xc00009e260}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Third node: &amp;{9 &lt;nil&gt;}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Fourth node: &lt;nil&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// After deleting element from index: 0</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Head node: &amp;{3 0xc00009e260}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Second node: &amp;{9 &lt;nil&gt;}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="displaying-linked-list">Displaying Linked List</h2>
<p>We have to iterate over all the elements in a linked list to display them in the output.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span></code></pre></td>
<td class="lntd">
<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">Node</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">value</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">Node</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">type</span> <span class="nx">LinkedList</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">head</span> <span class="o">*</span><span class="nx">Node</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="p">(</span><span class="nx">ll</span> <span class="o">*</span><span class="nx">LinkedList</span><span class="p">)</span> <span class="nf">display</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">ll</span><span class="p">.</span><span class="nx">head</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Since we have to reach the last element itself</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// we will stop the loop only when the temp is nil</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">value</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></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">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">linkedList</span> <span class="nx">LinkedList</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span> <span class="mi">9</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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="nx">linkedList</span><span class="p">.</span><span class="nf">display</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">// 2-&gt;3-&gt;5-&gt;9-&gt;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h1 id="variations-of-a-linked-list">Variations of a Linked List</h1>
<h2 id="doubly-linked-list">Doubly Linked List</h2>
<p>We can add a <code>prev</code> pointer in the linked list node to store the address of the previous node. Although it increases the memory space allocated for each node, the time complexity of iterating in reverse (from any particular node) will be improved.</p>
<p align="center"><img src="linked-list-double.png" alt="Doubly Linked List"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Node</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">prev</span> <span class="o">*</span><span class="nx">Node</span>
</span></span><span class="line"><span class="cl">    <span class="nx">value</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">Node</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">type</span> <span class="nx">DoublyLinkedList</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">head</span> <span class="o">*</span><span class="nx">Node</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="circular-linked-list">Circular Linked List</h2>
<p>In a <strong>circular linked list</strong>, a node is referenced two or more times. Iterating over a circular linked list results in an infinite loop.</p>
<p align="center"><img src="linked-list-circular.png" alt="Circular Linked List"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span></code></pre></td>
<td class="lntd">
<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">Node</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">value</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">Node</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">type</span> <span class="nx">LinkedList</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">head</span> <span class="o">*</span><span class="nx">Node</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="p">(</span><span class="nx">ll</span> <span class="o">*</span><span class="nx">LinkedList</span><span class="p">)</span> <span class="nf">display</span><span class="p">(</span><span class="nx">limit</span> <span class="kt">int</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">ll</span><span class="p">.</span><span class="nx">head</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Loop will end upon reaching the last element</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// or hitting the limit of elements</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">;</span><span class="nx">limit</span><span class="p">&gt;</span><span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="nx">temp</span><span class="o">!=</span><span class="kc">nil</span><span class="p">;</span><span class="nx">limit</span><span class="o">--</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">value</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></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">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">linkedList</span> <span class="nx">LinkedList</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</span> <span class="p">=</span> <span class="o">&amp;</span><span class="p">(</span><span class="nx">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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="nx">newNode</span> <span class="o">:=</span> <span class="nx">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">99</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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="nx">linkedList</span><span class="p">.</span><span class="nx">head</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="nx">newNode</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="o">&amp;</span><span class="p">(</span><span class="nx">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span> <span class="mi">9</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</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="nx">linkedList</span><span class="p">.</span><span class="nx">head</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">Node</span><span class="p">{</span><span class="nx">value</span><span class="p">:</span><span class="mi">6</span><span class="p">,</span> <span class="nx">next</span><span class="p">:</span><span class="kc">nil</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nx">head</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="nx">newNode</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">linkedList</span><span class="p">.</span><span class="nf">display</span><span class="p">(</span><span class="mi">10</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">// 2-&gt;3-&gt;99-&gt;6-&gt;99-&gt;6-&gt;99-&gt;6-&gt;99-&gt;6-&gt;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<h1 id="resources">Resources</h1>
<p><a href="https://www.freecodecamp.org/news/how-linked-lists-work/" target="_blank">How Does a Linked List Work? A Beginner&rsquo;s Guide to Linked Lists</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Finding the Longest Consecutive Sequence in an Array</title>
      <link>http://www.avni.sh/posts/computer-science/interview-preparation/longest-consecutive/</link>
      <pubDate>Thu, 09 Nov 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span><span class="lnt">71
</span><span class="lnt">72
</span><span class="lnt">73
</span><span class="lnt">74
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<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/computer-science/interview-preparation/encoding-and-decoding-strings/</link>
      <pubDate>Mon, 06 Nov 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span><span class="lnt">71
</span><span class="lnt">72
</span><span class="lnt">73
</span><span class="lnt">74
</span><span class="lnt">75
</span><span class="lnt">76
</span><span class="lnt">77
</span><span class="lnt">78
</span><span class="lnt">79
</span><span class="lnt">80
</span><span class="lnt">81
</span><span class="lnt">82
</span><span class="lnt">83
</span><span class="lnt">84
</span><span class="lnt">85
</span><span class="lnt">86
</span><span class="lnt">87
</span><span class="lnt">88
</span><span class="lnt">89
</span><span class="lnt">90
</span><span class="lnt">91
</span><span class="lnt">92
</span><span class="lnt">93
</span><span class="lnt">94
</span><span class="lnt">95
</span><span class="lnt">96
</span><span class="lnt">97
</span><span class="lnt">98
</span><span class="lnt">99
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span><span class="lnt">71
</span><span class="lnt">72
</span><span class="lnt">73
</span><span class="lnt">74
</span><span class="lnt">75
</span><span class="lnt">76
</span><span class="lnt">77
</span><span class="lnt">78
</span><span class="lnt">79
</span><span class="lnt">80
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<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/computer-science/interview-preparation/is-valid-sudoku/</link>
      <pubDate>Thu, 02 Nov 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><p>To validate each row we can create a function called <code>checkRowValidity</code>.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><p>We can implement a similar function <code>checkColumnValidity</code> to validate columns.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><p>For validating every 3x3 sub-matrix we can implement <code>checkSubMatrixValidity</code>.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><h3 id="complete-code-for-the-optimal-solution">Complete Code for the Optimal Solution</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span><span class="lnt">121
</span><span class="lnt">122
</span><span class="lnt">123
</span><span class="lnt">124
</span><span class="lnt">125
</span><span class="lnt">126
</span><span class="lnt">127
</span><span class="lnt">128
</span><span class="lnt">129
</span><span class="lnt">130
</span><span class="lnt">131
</span><span class="lnt">132
</span><span class="lnt">133
</span><span class="lnt">134
</span><span class="lnt">135
</span><span class="lnt">136
</span><span class="lnt">137
</span><span class="lnt">138
</span><span class="lnt">139
</span><span class="lnt">140
</span><span class="lnt">141
</span><span class="lnt">142
</span><span class="lnt">143
</span><span class="lnt">144
</span><span class="lnt">145
</span><span class="lnt">146
</span><span class="lnt">147
</span><span class="lnt">148
</span><span class="lnt">149
</span><span class="lnt">150
</span><span class="lnt">151
</span><span class="lnt">152
</span><span class="lnt">153
</span><span class="lnt">154
</span><span class="lnt">155
</span><span class="lnt">156
</span><span class="lnt">157
</span><span class="lnt">158
</span><span class="lnt">159
</span><span class="lnt">160
</span><span class="lnt">161
</span><span class="lnt">162
</span><span class="lnt">163
</span><span class="lnt">164
</span><span class="lnt">165
</span><span class="lnt">166
</span><span class="lnt">167
</span><span class="lnt">168
</span><span class="lnt">169
</span><span class="lnt">170
</span><span class="lnt">171
</span><span class="lnt">172
</span><span class="lnt">173
</span><span class="lnt">174
</span><span class="lnt">175
</span><span class="lnt">176
</span><span class="lnt">177
</span><span class="lnt">178
</span><span class="lnt">179
</span><span class="lnt">180
</span><span class="lnt">181
</span><span class="lnt">182
</span><span class="lnt">183
</span><span class="lnt">184
</span><span class="lnt">185
</span><span class="lnt">186
</span><span class="lnt">187
</span><span class="lnt">188
</span><span class="lnt">189
</span><span class="lnt">190
</span><span class="lnt">191
</span><span class="lnt">192
</span><span class="lnt">193
</span><span class="lnt">194
</span><span class="lnt">195
</span><span class="lnt">196
</span><span class="lnt">197
</span><span class="lnt">198
</span><span class="lnt">199
</span><span class="lnt">200
</span><span class="lnt">201
</span><span class="lnt">202
</span><span class="lnt">203
</span><span class="lnt">204
</span><span class="lnt">205
</span><span class="lnt">206
</span><span class="lnt">207
</span><span class="lnt">208
</span><span class="lnt">209
</span><span class="lnt">210
</span><span class="lnt">211
</span><span class="lnt">212
</span><span class="lnt">213
</span><span class="lnt">214
</span><span class="lnt">215
</span><span class="lnt">216
</span><span class="lnt">217
</span><span class="lnt">218
</span><span class="lnt">219
</span><span class="lnt">220
</span><span class="lnt">221
</span><span class="lnt">222
</span><span class="lnt">223
</span><span class="lnt">224
</span><span class="lnt">225
</span><span class="lnt">226
</span><span class="lnt">227
</span><span class="lnt">228
</span><span class="lnt">229
</span><span class="lnt">230
</span><span class="lnt">231
</span><span class="lnt">232
</span><span class="lnt">233
</span><span class="lnt">234
</span><span class="lnt">235
</span><span class="lnt">236
</span><span class="lnt">237
</span><span class="lnt">238
</span><span class="lnt">239
</span><span class="lnt">240
</span><span class="lnt">241
</span><span class="lnt">242
</span><span class="lnt">243
</span><span class="lnt">244
</span><span class="lnt">245
</span><span class="lnt">246
</span><span class="lnt">247
</span><span class="lnt">248
</span><span class="lnt">249
</span><span class="lnt">250
</span><span class="lnt">251
</span><span class="lnt">252
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<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/computer-science/interview-preparation/product-except-self/</link>
      <pubDate>Sat, 28 Oct 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<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/computer-science/interview-preparation/top-k-frequent/</link>
      <pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span><span class="lnt">71
</span><span class="lnt">72
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<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/computer-science/interview-preparation/group-anagrams/</link>
      <pubDate>Sun, 22 Oct 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><p>Finally, we use <code>generateCountHashMap</code> and <code>loadStringValue</code> to implement the <code>groupAnagrams</code> function.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><h3 id="complete-code">Complete Code</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span><span class="lnt">71
</span><span class="lnt">72
</span><span class="lnt">73
</span><span class="lnt">74
</span><span class="lnt">75
</span><span class="lnt">76
</span><span class="lnt">77
</span><span class="lnt">78
</span><span class="lnt">79
</span><span class="lnt">80
</span><span class="lnt">81
</span><span class="lnt">82
</span><span class="lnt">83
</span><span class="lnt">84
</span><span class="lnt">85
</span><span class="lnt">86
</span><span class="lnt">87
</span><span class="lnt">88
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<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/computer-science/interview-preparation/two-sums/</link>
      <pubDate>Sun, 15 Oct 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<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/computer-science/interview-preparation/is-anagram/</link>
      <pubDate>Thu, 12 Oct 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<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/computer-science/interview-preparation/contains-duplicate/</link>
      <pubDate>Tue, 10 Oct 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</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"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span></code></pre></td>
<td class="lntd">
<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></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<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>
    <item>
      <title>Rabin-Karp Substring Search</title>
      <link>http://www.avni.sh/posts/computer-science/interview-preparation/rabin-karp-substring-search/</link>
      <pubDate>Sun, 08 Oct 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/rabin-karp-substring-search/</guid>
      <description>Rabin-Karp Substring Search is an efficient algorithm to search a string within another string</description>
      <content:encoded><![CDATA[<p>Searching contents on a website for a specific keyword, code search in text editors &amp; IDEs, and information retrieval systems used in libraries and archives are use cases for an algorithm that searches a string within another string.</p>
<p>Unlike searching for a single character, searching for a complete string could be challenging.</p>
<p align="center"><img src="substring-search-example.png" alt="Example of a substring search"></p>
<p>If we search string <code>ION</code> in <code>DICTIONARY</code>. For each character in <code>DICTIONARY</code>, we have to look for <code>I</code>, <code>O</code>, and <code>N</code> in the same order.</p>
<p>Throughout this article, I&rsquo;ll be referring to the two strings as the following</p>
<ul>
<li><strong>search string</strong>: The string upon which the search is executed. Example: <code>DICTIONARY</code></li>
<li><strong>input string</strong>: The string being searched. Example: <code>ION</code></li>
</ul>
<h1 id="brute-force-solution">Brute Force Solution</h1>
<p>A brute force solution of substring search will loop over characters in the search string and for each character, it will perform another loop over characters in the input string to check for equality.</p>
<h2 id="psuedo-code-for-the-brute-force-solution">Psuedo Code for the Brute Force Solution</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">loop(index1 in search_string)
</span></span><span class="line"><span class="cl">    matchFlag = true
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    loop(index2 in input_string)
</span></span><span class="line"><span class="cl">        if search_string[index1 + index2] != input_string[index2]
</span></span><span class="line"><span class="cl">            matchFlag = false
</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">    if matchFlag == true
</span></span><span class="line"><span class="cl">        return True
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">return False
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="best-case-scenario">Best Case Scenario</h2>
<p>The best performance scenario for this algorithm will be when we have to search a string within itself.</p>
<p align="center"><img src="best-case-brute-force.png" alt="Best Case scenario for brute force substring search algorithm"></p>
<p>Since the outer loop (over search string) is executed only once the resulting time complexity is $O(m)$, where $m$ is the size of the input string.</p>
<p>The result will also be the same if the search string has characters after <code>ION</code> (like <code>IONIZED</code>, <code>IONIC</code>, etc.) because the algorithm will exit on the first match.</p>
<h2 id="worst-case-scenario">Worst Case Scenario</h2>
<p>The worst-case scenario in terms of performance will be when the input string is not present in the search string.</p>
<p align="center"><img src="worst-case-brute-force.png" alt="Worst Case scenario for brute force substring search algorithm"></p>
<p>The algorithm will loop over all characters in the search string and for each character, it will also loop over every character in the input string. The worst-case time complexity will be $O((n-m) m)$ where $n$ and $m$ are lengths of the search string and input string respectively.</p>
<h2 id="code-for-brute-force-solution">Code for Brute Force Solution</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span></code></pre></td>
<td class="lntd">
<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">bruteForceSubstringSearch</span><span class="p">(</span><span class="nx">inputString</span> <span class="kt">string</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                                <span class="nx">searchString</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></span><span class="line"><span class="cl">    <span class="c1">// Looping over characters in searchString, time complexity: O(n)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">indexN</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">indexN</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">searchString</span><span class="p">)</span><span class="o">-</span><span class="nb">len</span><span class="p">(</span><span class="nx">inputString</span><span class="p">);</span><span class="nx">indexN</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">matchFlag</span> <span class="o">:=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Looping over characters in inputString, time complexity: O(m)</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">indexM</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">indexM</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">indexM</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">searchString</span><span class="p">[</span><span class="nx">indexN</span><span class="o">+</span><span class="nx">indexM</span><span class="p">]</span> <span class="o">!=</span> <span class="nx">inputString</span><span class="p">[</span><span class="nx">indexM</span><span class="p">]{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">matchFlag</span> <span class="p">=</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="c1">// Exit function if a match is found</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nx">matchFlag</span> <span class="o">==</span> <span class="kc">true</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></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">searchString</span> <span class="o">:=</span> <span class="s">&#34;DICTIONARY&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">inputString</span> <span class="o">:=</span> <span class="s">&#34;ION&#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="s">&#34;String&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="nx">inputString</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="s">&#34;is present in&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="nx">searchString</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="nf">bruteForceSubstringSearch</span><span class="p">(</span><span class="nx">inputString</span><span class="p">,</span> <span class="nx">searchString</span><span class="p">))</span> 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">searchString</span> <span class="p">=</span> <span class="s">&#34;FOOTBALL&#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="s">&#34;String&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="nx">inputString</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="s">&#34;is present in&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="nx">searchString</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="nf">bruteForceSubstringSearch</span><span class="p">(</span><span class="nx">inputString</span><span class="p">,</span> <span class="nx">searchString</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">// String ION is present in DICTIONARY : true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// String ION is present in FOOTBALL : false</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h1 id="optimized-solution">Optimized Solution</h1>
<p>The major contributor to the time complexity of brute-force solution is the recurring inner loop ($O(m)$). If we can somehow reduce it to constant time, then the total time complexity of the program will be $O(n)$.</p>
<h2 id="rabin-karp-substring-search">Rabin-Karp Substring Search</h2>
<p>The Rabin-Karp substring search algorithm was presented by Michael O. Rabin and Richard M. Karp in their research paper <a href="https://www.scinapse.io/papers/1972418517" target="_blank">Efficient randomized pattern-matching algorithms</a> published in March 1987.</p>
<p>In this algorithm, we calculate a <em>rolling</em> hash for all characters in the search string like the following</p>
<p align="center"><img src="rabin-karp-explain.png" alt="Worst Case scenario for brute force substring search algorithm"></p>
<p>then we use the same hashing function on the input string.</p>
<p>The hash value of the input string is searched within rolling hashes of the search string. If a match is found then the characters of both strings are compared to confirm the match, as different strings could have the same hash value due to <a href="/posts/computer-science/interview-preparation/arrays-strings-hashmaps/#hash-function" target="_blank">hash collisions</a>.</p>
<p>The hash function could be defined like following</p>
<p>$$hash(input) = code(input[0])*128^{(n-1)} + code(input[1])*128^{(n-2)}+ \dots + code(input[n-1])*128^{0}$$</p>
<ul>
<li>$input$ is a set of characters for which the hash value is going to be calculated.</li>
<li>$code()$ function converts characters to their ASCII values.</li>
<li>$n$ is the length of $input$.</li>
<li>The base is selected as $128$ to prevent hash collisions.</li>
</ul>
<p>Applying this hash function on string <code>ION</code>, we get</p>
<p>$$hash(ION) = code(I)*128^{2} + code(O)*128^{1} + code(N)*128^{0}$$
$$hash(ION) = 73 \times 16384 + 79 \times 128 + 78 \times 1$$
$$hash(ION) = 1206222$$</p>
<p>Using arithmetic we can save the computation cost of calculating rolling hashes.</p>
<p>We can calculate the hash of the first 3 characters (because the size of the search string <code>ION</code> is 3).</p>
<p>$$ hash(DIC) = code(D)*128^2 + code(I)*128^1 + code(C)*128^0 $$</p>
<p>We can derive the value of the next rolling hash, $hash(ICT)$ from the hash of the first three characters, $hash(DIC)$ by performing the following operations</p>
<p>$$ hash(ICT) = code(I)*128^2 + code(C)*128^1 + code(T)*128^0 $$
$$ hash(ICT) = (code(I)*128^1 + code(C)*128^0)*128 + code(T)*128^0 $$
$$ hash(ICT) = (hash(DIC) - code(D)*128)*128 + code(T)*128^0 $$</p>
<p>We can repeat this operation to calculate all rolling hash values.</p>
<h2 id="psuedo-code-for-rabin-karp-substring-search">Psuedo Code for Rabin-Karp Substring Search</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">loop (index in M)
</span></span><span class="line"><span class="cl">	if rollingHash[index] == rollingHash(N):
</span></span><span class="line"><span class="cl">		if match(M[index:index+len(N)], N):
</span></span><span class="line"><span class="cl">			return True
</span></span><span class="line"><span class="cl">return False
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="best-case-scenario-1">Best Case Scenario</h2>
<p>The best case scenario for the Rabin-Karp algorithm is the same as the brute-force algorithm i.e. the input string is the same as the search string or present at the start of the search string.</p>
<p>Since we are going to match the string only once the time complexity of the best case will be $O(n+m)$ where $n$ and $m$ are the sizes of the input string and search string respectively.</p>
<h2 id="worst-case-scenario-1">Worst Case Scenario</h2>
<p>The worst-case search string will have multiple substrings with the same rolling hash value as the input string while also having different characters i.e. we have to match characters for almost every character in the search string.</p>
<p align="center"><img src="rabin-karp-worst-case.png" alt="Worst Case scenario for Rabin-Karp substring search algorithm"></p>
<p>This is the same as running the brute-force algorithm. So the worst case time complexity is $O((n-m)n)$.</p>
<h2 id="code-for-optimized-solution">Code for Optimized Solution</h2>
<p>We can start with the implementation of the <code>calculateHash()</code> function that takes a string and a base value (<code>2</code>, <code>4</code>, <code>8</code>, etc.) as input and returns a hash value as output.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<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">calculateHash</span><span class="p">(</span><span class="nx">inputString</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">base</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">hashValue</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="c1">// The time complexity of this function is O(m)</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// where m is the size of inputString</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">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">multiple</span> <span class="o">:=</span> <span class="nx">math</span><span class="p">.</span><span class="nf">Pow</span><span class="p">(</span><span class="nb">float64</span><span class="p">(</span><span class="nx">base</span><span class="p">),</span> <span class="nb">float64</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nx">inputString</span><span class="p">)</span><span class="o">-</span><span class="nx">i</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">hashValue</span> <span class="o">+=</span> <span class="nb">int</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="nb">int</span><span class="p">(</span><span class="nx">multiple</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">hashValue</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Now using this function we can also implement a <code>calculateRollingHash()</code> function to use on the search string.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span></code></pre></td>
<td class="lntd">
<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">calculateRollingHash</span><span class="p">(</span><span class="nx">searchString</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">lenInputString</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">base</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">tempHash</span> <span class="o">:=</span> <span class="nf">calculateHash</span><span class="p">(</span><span class="nx">searchString</span><span class="p">[:</span><span class="nx">lenInputString</span><span class="p">],</span> <span class="nx">base</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">rollingHashes</span> <span class="p">[]</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl">  <span class="nx">rollingHashes</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">rollingHashes</span><span class="p">,</span> <span class="nx">tempHash</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 is O(n)</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// where n is the size of searchString</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">1</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">searchString</span><span class="p">)</span><span class="o">-</span><span class="nx">lenInputString</span><span class="o">+</span><span class="mi">1</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">removedChar</span> <span class="o">:=</span> <span class="nx">searchString</span><span class="p">[</span><span class="nx">i</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">addedChar</span> <span class="o">:=</span> <span class="nx">searchString</span><span class="p">[</span><span class="nx">i</span><span class="o">-</span><span class="mi">1</span><span class="o">+</span><span class="nx">lenInputString</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Reusing tempHash to calculate values of subsequent hashes</span>
</span></span><span class="line"><span class="cl">    <span class="nx">tempHash</span> <span class="p">=</span> <span class="nx">tempHash</span> <span class="o">-</span> <span class="nb">int</span><span class="p">(</span><span class="nx">removedChar</span><span class="p">)</span><span class="o">*</span><span class="nb">int</span><span class="p">(</span><span class="nx">math</span><span class="p">.</span><span class="nf">Pow</span><span class="p">(</span><span class="nb">float64</span><span class="p">(</span><span class="nx">base</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">lenInputString</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">tempHash</span> <span class="p">=</span> <span class="nx">tempHash</span><span class="o">*</span><span class="nx">base</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="nx">addedChar</span><span class="p">)</span> 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">rollingHashes</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">rollingHashes</span><span class="p">,</span> <span class="nx">tempHash</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">rollingHashes</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>A <code>match()</code> function for verifying the character match between the input string and search string.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<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">match</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></span><span class="line"><span class="cl">  <span class="c1">// Matching characters in string1 to characters in string2</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Length of both strings is assumed to be equal</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></code></pre></td></tr></table>
</div>
</div><p>Using the helper functions implemented above we can finally implement the <code>rabinKarpSearch()</code> function that returns a boolean value representing the presence of an input string in the search string.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span></code></pre></td>
<td class="lntd">
<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">rabinKarpSearch</span><span class="p">(</span><span class="nx">inputString</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">searchString</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">base</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="c1">// Calculate all rolling hashes for searchString</span>
</span></span><span class="line"><span class="cl">  <span class="nx">rollingHashes</span> <span class="o">:=</span> <span class="nf">calculateRollingHash</span><span class="p">(</span><span class="nx">searchString</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">inputString</span><span class="p">),</span> <span class="nx">base</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="c1">// Calculate the hash value of inputString</span>
</span></span><span class="line"><span class="cl">  <span class="nx">inputStringHash</span> <span class="o">:=</span> <span class="nf">calculateHash</span><span class="p">(</span><span class="nx">inputString</span><span class="p">,</span> <span class="nx">base</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">rollingHashes</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">matchFlag</span> <span class="o">:=</span> <span class="kc">false</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">inputStringHash</span> <span class="o">==</span> <span class="nx">rollingHashes</span><span class="p">[</span><span class="nx">i</span><span class="p">]{</span>
</span></span><span class="line"><span class="cl">      <span class="c1">// Match both strings using characters</span>
</span></span><span class="line"><span class="cl">      <span class="nx">matchFlag</span> <span class="p">=</span> <span class="nf">match</span><span class="p">(</span><span class="nx">inputString</span><span class="p">,</span> <span class="nx">searchString</span><span class="p">[</span><span class="nx">i</span><span class="p">:</span><span class="nx">i</span><span class="o">+</span><span class="nb">len</span><span class="p">(</span><span class="nx">inputString</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">if</span> <span class="nx">matchFlag</span> <span class="o">==</span> <span class="kc">true</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="c1">// Exit function on the first match</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></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></td></tr></table>
</div>
</div><h3 id="complete-code">Complete Code</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span><span class="lnt">121
</span><span class="lnt">122
</span><span class="lnt">123
</span><span class="lnt">124
</span><span class="lnt">125
</span><span class="lnt">126
</span><span class="lnt">127
</span><span class="lnt">128
</span><span class="lnt">129
</span><span class="lnt">130
</span></code></pre></td>
<td class="lntd">
<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;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">calculateHash</span><span class="p">(</span><span class="nx">inputString</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">base</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">hashValue</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="c1">// The time complexity of this function is O(m)</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// where m is the size of inputString</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">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">multiple</span> <span class="o">:=</span> <span class="nx">math</span><span class="p">.</span><span class="nf">Pow</span><span class="p">(</span><span class="nb">float64</span><span class="p">(</span><span class="nx">base</span><span class="p">),</span> <span class="nb">float64</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nx">inputString</span><span class="p">)</span><span class="o">-</span><span class="nx">i</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">hashValue</span> <span class="o">+=</span> <span class="nb">int</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="nb">int</span><span class="p">(</span><span class="nx">multiple</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">hashValue</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">calculateRollingHash</span><span class="p">(</span><span class="nx">searchString</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">lenInputString</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">base</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">tempHash</span> <span class="o">:=</span> <span class="nf">calculateHash</span><span class="p">(</span><span class="nx">searchString</span><span class="p">[:</span><span class="nx">lenInputString</span><span class="p">],</span> <span class="nx">base</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">rollingHashes</span> <span class="p">[]</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl">  <span class="nx">rollingHashes</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">rollingHashes</span><span class="p">,</span> <span class="nx">tempHash</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 is O(n)</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// where n is the size of searchString</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">1</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">searchString</span><span class="p">)</span><span class="o">-</span><span class="nx">lenInputString</span><span class="o">+</span><span class="mi">1</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">removedChar</span> <span class="o">:=</span> <span class="nx">searchString</span><span class="p">[</span><span class="nx">i</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">addedChar</span> <span class="o">:=</span> <span class="nx">searchString</span><span class="p">[</span><span class="nx">i</span><span class="o">-</span><span class="mi">1</span><span class="o">+</span><span class="nx">lenInputString</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Reusing tempHash to calculate values of subsequent hashes</span>
</span></span><span class="line"><span class="cl">    <span class="nx">tempHash</span> <span class="p">=</span> <span class="nx">tempHash</span> <span class="o">-</span> <span class="nb">int</span><span class="p">(</span><span class="nx">removedChar</span><span class="p">)</span><span class="o">*</span><span class="nb">int</span><span class="p">(</span><span class="nx">math</span><span class="p">.</span><span class="nf">Pow</span><span class="p">(</span><span class="nb">float64</span><span class="p">(</span><span class="nx">base</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">lenInputString</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">tempHash</span> <span class="p">=</span> <span class="nx">tempHash</span><span class="o">*</span><span class="nx">base</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="nx">addedChar</span><span class="p">)</span> 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">rollingHashes</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">rollingHashes</span><span class="p">,</span> <span class="nx">tempHash</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">rollingHashes</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">match</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></span><span class="line"><span class="cl">  <span class="c1">// Matching characters in string1 to characters in string2</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Length of both strings is assumed to be equal</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">rabinKarpSearch</span><span class="p">(</span><span class="nx">inputString</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">searchString</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">base</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="c1">// Calculate all rolling hashes for searchString</span>
</span></span><span class="line"><span class="cl">  <span class="nx">rollingHashes</span> <span class="o">:=</span> <span class="nf">calculateRollingHash</span><span class="p">(</span><span class="nx">searchString</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">inputString</span><span class="p">),</span> <span class="nx">base</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="c1">// Calculate the hash value of inputString</span>
</span></span><span class="line"><span class="cl">  <span class="nx">inputStringHash</span> <span class="o">:=</span> <span class="nf">calculateHash</span><span class="p">(</span><span class="nx">inputString</span><span class="p">,</span> <span class="nx">base</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">rollingHashes</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">matchFlag</span> <span class="o">:=</span> <span class="kc">false</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">inputStringHash</span> <span class="o">==</span> <span class="nx">rollingHashes</span><span class="p">[</span><span class="nx">i</span><span class="p">]{</span>
</span></span><span class="line"><span class="cl">      <span class="c1">// Match both strings using characters</span>
</span></span><span class="line"><span class="cl">      <span class="nx">matchFlag</span> <span class="p">=</span> <span class="nf">match</span><span class="p">(</span><span class="nx">inputString</span><span class="p">,</span> <span class="nx">searchString</span><span class="p">[</span><span class="nx">i</span><span class="p">:</span><span class="nx">i</span><span class="o">+</span><span class="nb">len</span><span class="p">(</span><span class="nx">inputString</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">if</span> <span class="nx">matchFlag</span> <span class="o">==</span> <span class="kc">true</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="c1">// Exit function on the first match</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></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">inputString</span> <span class="o">:=</span> <span class="s">&#34;ION&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">searchString</span> <span class="o">:=</span> <span class="s">&#34;DICTIONARY&#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="s">&#34;rabinKarpSearch&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nx">inputString</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="s">&#34;in&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nx">searchString</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="s">&#34;result:&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nf">rabinKarpSearch</span><span class="p">(</span><span class="nx">inputString</span><span class="p">,</span> <span class="nx">searchString</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">searchString</span> <span class="p">=</span> <span class="s">&#34;FOOTBALL&#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="s">&#34;rabinKarpSearch&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nx">inputString</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="s">&#34;in&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nx">searchString</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="s">&#34;result:&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nf">rabinKarpSearch</span><span class="p">(</span><span class="nx">inputString</span><span class="p">,</span> <span class="nx">searchString</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">searchString</span> <span class="p">=</span> <span class="s">&#34;UNION&#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="s">&#34;rabinKarpSearch&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nx">inputString</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="s">&#34;in&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nx">searchString</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="s">&#34;result:&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nf">rabinKarpSearch</span><span class="p">(</span><span class="nx">inputString</span><span class="p">,</span> <span class="nx">searchString</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">searchString</span> <span class="p">=</span> <span class="s">&#34;IONIC&#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="s">&#34;rabinKarpSearch&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nx">inputString</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="s">&#34;in&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nx">searchString</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="s">&#34;result:&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nf">rabinKarpSearch</span><span class="p">(</span><span class="nx">inputString</span><span class="p">,</span> <span class="nx">searchString</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">searchString</span> <span class="p">=</span> <span class="s">&#34;ION&#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="s">&#34;rabinKarpSearch&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nx">inputString</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="s">&#34;in&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nx">searchString</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="s">&#34;result:&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">               <span class="nf">rabinKarpSearch</span><span class="p">(</span><span class="nx">inputString</span><span class="p">,</span> <span class="nx">searchString</span><span class="p">,</span> <span class="mi">2</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">// rabinKarpSearch ION in DICTIONARY result: true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// rabinKarpSearch ION in FOOTBALL result: false</span>
</span></span><span class="line"><span class="cl"><span class="c1">// rabinKarpSearch ION in UNION result: true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// rabinKarpSearch ION in IONIC result: true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// rabinKarpSearch ION in ION result: true</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<h1 id="resources">Resources</h1>
<p><a href="https://www.scinapse.io/papers/1972418517" target="_blank">Efficient randomized pattern-matching algorithms</a><br>
<a href="https://amturing.acm.org/award_winners/rabin_9681074.cfm" target="_blank">Michael O. Rabin</a><br>
<a href="https://www2.eecs.berkeley.edu/Faculty/Homepages/karp.html" target="_blank">Richard M. Karp</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Arrays, Strings, and HashMaps</title>
      <link>http://www.avni.sh/posts/computer-science/interview-preparation/arrays-strings-hashmaps/</link>
      <pubDate>Fri, 29 Sep 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/arrays-strings-hashmaps/</guid>
      <description>Understanding basic data structures like arrays, strings, and hashmaps</description>
      <content:encoded><![CDATA[<p>Data structures like arrays, strings, and hashmaps are available by default in most programming languages. They facilitate storage of large amounts of data in an efficient format which makes it easier (and sometimes relatively faster) to access during runtime.</p>
<h1 id="arrays">Arrays</h1>
<p align="center"><img src="arrays.png" alt="Array"></p>
<p>An array is a sequential store of data (referred to as <em>elements</em>).</p>
<p>In languages like Python, an array can store elements with multiple data types, like, <code>[1, &quot;Hello, World&quot;, True]</code> but for languages like Go, C++, and Java an array can store elements of a singular data type.</p>
<h2 id="iterating-over-an-array-using-indexes">Iterating over an array using indexes</h2>
<p>An <strong>index</strong> is assigned to each element based on its location in the array. The value stored at the <code>index</code> could be extracted using <code>[ ]</code> brackets with the array&rsquo;s variable name, for example, <code>arrayExample[index]</code>.</p>
<p>We can iterate over values stored in an array by defining a loop starting from <code>0</code> (index of the first element in the <a href="/posts/go/go-programming-language/" target="_blank">Go Programming Language</a>) till <code>len(arrayExample)-1</code> (index of last element).</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<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">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">  <span class="nx">arrayExample</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">12</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3123</span><span class="p">,</span> <span class="mi">78</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">arrayExample</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Element at index&#34;</span><span class="p">,</span> <span class="nx">i</span><span class="p">,</span> <span class="s">&#34;is:&#34;</span><span class="p">,</span> <span class="nx">arrayExample</span><span class="p">[</span><span class="nx">i</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">// Element at index 0 is: 12</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index 1 is: 3</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index 2 is: 2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index 3 is: 1</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index 4 is: 3123</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index 5 is: 78</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>The <a href="/posts/computer-science/interview-preparation/time-complexity/" target="_blank">time complexity</a> of this loop is $O(n)$ where $n$ is the size of <code>arrayExample</code>.</p>
<h2 id="nested-arrays">Nested Arrays</h2>
<p>A simple array will store data in just one dimension but we can nest arrays to store multidimensional data like <em>matrices</em>.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="nx">nestedArrayExample</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="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">234</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">                        <span class="p">{</span><span class="mi">456</span><span class="p">,</span> <span class="mi">345</span><span class="p">,</span> <span class="mi">3457</span><span class="p">,</span> <span class="mi">5</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">                        <span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>To iterate over the elements in a nested array we have to define multiple nested loops.
The time complexity of fetching all the elements from a nested array will be $O(n^m)$ where $n$ is the size of individual arrays and $m$ is the order of nesting (to iterate over all the elements we have to define $m$ nested loops each of length $n$).</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span></code></pre></td>
<td class="lntd">
<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">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">  <span class="nx">nestedArrayExample</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="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">234</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="mi">456</span><span class="p">,</span> <span class="mi">345</span><span class="p">,</span> <span class="mi">3457</span><span class="p">,</span> <span class="mi">5</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">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">nestedArrayExample</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Nested Array at index:&#34;</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">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">nestedArrayExample</span><span class="p">[</span><span class="nx">i</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">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;Element at index[%d][%d]: %d \n&#34;</span><span class="p">,</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">j</span><span class="p">,</span> <span class="nx">nestedArrayExample</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="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Nested Array at index: 0</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index[0][0]: 1 </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index[0][1]: 123 </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index[0][2]: 123 </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index[0][3]: 234 </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Nested Array at index: 1</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index[1][0]: 456 </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index[1][1]: 345 </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index[1][2]: 3457 </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index[1][3]: 5</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>In the example above an array is nested inside another array ($m=2$), to traverse it we have to define a loop nested inside another loop. Thus, the time complexity of the program is $O(n^2)$.</p>
<h2 id="arraylist">ArrayList</h2>
<p align="center"><img src="arraylist.png" alt="ArrayList"></p>
<p><strong>ArrayList</strong> data structure is similar to an array but it doubles in size when it runs out of space. It is ideal for scenarios with limited memory space for program execution.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span></code></pre></td>
<td class="lntd">
<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">ArrayList</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">capacity</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">  <span class="nx">array</span> <span class="p">[]</span><span class="kt">int</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="p">(</span><span class="nx">al</span> <span class="o">*</span><span class="nx">ArrayList</span><span class="p">)</span> <span class="nf">insert</span><span class="p">(</span><span class="nx">x</span> <span class="kt">int</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">al</span><span class="p">.</span><span class="nx">capacity</span><span class="o">==</span><span class="mi">0</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// If ArrayList is at full capacity</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// then create a new temporary ArrayList</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// twice the size of the existing one</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;Resizing ArrayList&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">newArray</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">// Copy all the elements from existing</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// ArrayList to the new ArrayList</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// This will take O(n) time</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// where n is the size of al.array</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">al</span><span class="p">.</span><span class="nx">array</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">newArray</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">newArray</span><span class="p">,</span> <span class="nx">al</span><span class="p">.</span><span class="nx">array</span><span class="p">[</span><span class="nx">i</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">// Insert the element in the new ArrayList</span>
</span></span><span class="line"><span class="cl">    <span class="nx">newArray</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">newArray</span><span class="p">,</span> <span class="nx">x</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Increase the capacity of ArrayList</span>
</span></span><span class="line"><span class="cl">    <span class="nx">al</span><span class="p">.</span><span class="nx">capacity</span> <span class="p">=</span> <span class="nb">len</span><span class="p">(</span><span class="nx">al</span><span class="p">.</span><span class="nx">array</span><span class="p">)</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">// Replace the old ArrayList with a new one</span>
</span></span><span class="line"><span class="cl">    <span class="nx">al</span><span class="p">.</span><span class="nx">array</span> <span class="p">=</span> <span class="nx">newArray</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">// Insert the element into the existing ArrayList</span>
</span></span><span class="line"><span class="cl">    <span class="nx">al</span><span class="p">.</span><span class="nx">array</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">al</span><span class="p">.</span><span class="nx">array</span><span class="p">,</span> <span class="nx">x</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Decrement the capacity by 1</span>
</span></span><span class="line"><span class="cl">    <span class="nx">al</span><span class="p">.</span><span class="nx">capacity</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></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">al</span> <span class="o">:=</span> <span class="nx">ArrayList</span><span class="p">{</span><span class="nx">capacity</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span> <span class="nx">array</span><span class="p">:</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">al</span><span class="p">.</span><span class="nf">insert</span><span class="p">(</span><span class="mi">12</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">al</span><span class="p">.</span><span class="nf">insert</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">al</span><span class="p">.</span><span class="nf">insert</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">al</span><span class="p">.</span><span class="nf">insert</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">al</span><span class="p">.</span><span class="nf">insert</span><span class="p">(</span><span class="mi">3123</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;ArrayList after all elements are inserted:&#34;</span><span class="p">,</span> <span class="nx">al</span><span class="p">.</span><span class="nx">array</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">// Resizing ArrayList</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Resizing ArrayList</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Resizing ArrayList</span>
</span></span><span class="line"><span class="cl"><span class="c1">// ArrayList after all elements are inserted: [12 3 2 1 3123]</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>The time complexity of inserting a new element in ArrayList is assumed to be $O(1)$, but if the list is already at max capacity then the time complexity will be $O(n)$ where $n$ is the number of existing elements.</p>
<h1 id="strings">Strings</h1>
<p>A string is like an array of characters. It is defined as a separate datatype, but most array operations like loop, slice, and indexing are interoperable.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span></code></pre></td>
<td class="lntd">
<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">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">  <span class="nx">stringExample</span> <span class="o">:=</span> <span class="s">&#34;Hello, World&#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="s">&#34;First character is:&#34;</span><span class="p">,</span> <span class="nx">stringExample</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;Last character is:&#34;</span><span class="p">,</span> <span class="nx">stringExample</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="nx">stringExample</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="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Slice of string:&#34;</span><span class="p">,</span> <span class="nx">stringExample</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">4</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">stringExample</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">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;Character at index: %d is: %c \n&#34;</span><span class="p">,</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">stringExample</span><span class="p">[</span><span class="nx">i</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">// First character is: H</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Last character is: d</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Slice of string: ll</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Character at index: 0 is: H </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Character at index: 1 is: e </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Character at index: 2 is: l </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Character at index: 3 is: l </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Character at index: 4 is: o </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Character at index: 5 is: , </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Character at index: 6 is:   </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Character at index: 7 is: W </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Character at index: 8 is: o </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Character at index: 9 is: r </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Character at index: 10 is: l </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Character at index: 11 is: d</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="concatenation-of-strings">Concatenation of Strings</h2>
<p align="center"><img src="strings.png" alt="String Concatenation"></p>
<p>A program that concatenates two strings of size $m$ and $n$, has time complexity $O(m + n)$ or $O(2n)$ if both strings are of equal length.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span></code></pre></td>
<td class="lntd">
<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="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">concat</span><span class="p">(</span><span class="nx">stringA</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">stringB</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">// Create a new list of strings</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// to store the concatenated string</span>
</span></span><span class="line"><span class="cl">  <span class="kd">var</span> <span class="nx">newString</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">// Copy stringA</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">stringA</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">newString</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">newString</span><span class="p">,</span> <span class="nb">string</span><span class="p">(</span><span class="nx">stringA</span><span class="p">[</span><span class="nx">i</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">// Copy stringB</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">stringB</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">newString</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">newString</span><span class="p">,</span> <span class="nb">string</span><span class="p">(</span><span class="nx">stringB</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></span><span class="line"><span class="cl">  <span class="c1">// Join the list of strings to create a new string</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">newString</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">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">  <span class="nx">stringA</span> <span class="o">:=</span> <span class="s">&#34;Hello&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">stringB</span> <span class="o">:=</span> <span class="s">&#34;World&#34;</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;Concatenation of %s and %s is: %s \n&#34;</span><span class="p">,</span> <span class="nx">stringA</span><span class="p">,</span> <span class="nx">stringB</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">concat</span><span class="p">(</span><span class="nx">stringA</span><span class="p">,</span> <span class="nx">stringB</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">// Concatenation of Hello and World is: HelloWorld </span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="stringbuilder">StringBuilder</h2>
<p>Using <strong>StringBuilder</strong> (a dynamically sized array similar to ArrayList) we can reduce the time complexity of operations performed on a string.</p>
<p>Upon initialization, the StringBuilder will load the characters of a string into an array. If we have to concatenate another string of length $n$, the array will be resized with time complexity $O(n)$. Once all operations are performed, the array in StringBuilder can be converted back to a string.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span></code></pre></td>
<td class="lntd">
<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="p">)</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">StringBuilder</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">array</span> <span class="p">[]</span><span class="kt">string</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="p">(</span><span class="nx">sb</span> <span class="o">*</span><span class="nx">StringBuilder</span><span class="p">)</span> <span class="nf">load</span><span class="p">(</span><span class="nx">value</span> <span class="kt">string</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// We assume the time complexity of this function</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// to be O(1)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">sb</span><span class="p">.</span><span class="nx">array</span> <span class="p">=</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">Split</span><span class="p">(</span><span class="nx">value</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="p">(</span><span class="nx">sb</span> <span class="o">*</span><span class="nx">StringBuilder</span><span class="p">)</span> <span class="nf">concat</span><span class="p">(</span><span class="nx">value</span> <span class="kt">string</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Time complexity of concatenating a string of</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// length m will be O(m)</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">value</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">sb</span><span class="p">.</span><span class="nx">array</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">sb</span><span class="p">.</span><span class="nx">array</span><span class="p">,</span> <span class="nb">string</span><span class="p">(</span><span class="nx">value</span><span class="p">[</span><span class="nx">i</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">func</span> <span class="p">(</span><span class="nx">sb</span> <span class="o">*</span><span class="nx">StringBuilder</span><span class="p">)</span> <span class="nf">unload</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">// Just like load() method the time complexity of</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// unloading an array to string will be assumed as O(1)</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">sb</span><span class="p">.</span><span class="nx">array</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">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">  <span class="nx">sb</span> <span class="o">:=</span> <span class="nx">StringBuilder</span><span class="p">{</span><span class="nx">array</span><span class="p">:</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">sb</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="s">&#34;Hello&#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;Instance of StringBuilder:&#34;</span><span class="p">,</span> <span class="nx">sb</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">sb</span><span class="p">.</span><span class="nf">concat</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">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;StringBuilder array after concatenation:&#34;</span><span class="p">,</span> <span class="nx">sb</span><span class="p">.</span><span class="nx">array</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;Unloaded String:&#34;</span><span class="p">,</span> <span class="nx">sb</span><span class="p">.</span><span class="nf">unload</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">// Instance of StringBuilder: {[H e l l o]}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// StringBuilder array after concatenation: [H e l l o W o r l d]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Unloaded String: HelloWorld</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h1 id="hashmaps">HashMaps</h1>
<p align="center"><img src="hashtables.png" alt="HashMap"></p>
<p>A <strong>HashMap</strong> is a data structure that stores values mapped to keys. It is generally used to store values that require frequent access, as the time complexity of accessing/searching an element in HashMap is $O(1)$.</p>
<p>The <a href="/posts/go/go-programming-language/#maps" target="_blank">Map</a> in Go, is an implementation of the HashMap data structure.</p>
<h2 id="hash-function">Hash Function</h2>
<p>While inserting a value in HashMap, a <strong>Hash Function</strong> calculates a hash from the input value and allocates a location to store the value.</p>
<p>A HashMap collision occurs when two values have the same hash or they are allocated the same storage location. In the case of collision, multiple values could be stored in the same location using an array or <a href="/posts/computer-science/interview-preparation/linked-lists" target="_blank">LinkedList</a>.</p>
<p>An ideal hash function will produce the least collisions, resulting in $O(1)$ lookup time. But in the worst-case scenario (all values are inserted in the same location) the lookup time will increase to $O(n)$, same as an array.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span></code></pre></td>
<td class="lntd">
<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">HashMap</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">table</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></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">calculateHash</span><span class="p">(</span><span class="nx">value</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">return</span> <span class="nx">value</span><span class="o">%</span><span class="mi">10</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="p">(</span><span class="nx">hm</span> <span class="o">*</span><span class="nx">HashMap</span><span class="p">)</span> <span class="nf">insert</span><span class="p">(</span><span class="nx">insertValue</span> <span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Calculate hash value from insertValue</span>
</span></span><span class="line"><span class="cl">  <span class="nx">hash</span> <span class="o">:=</span> <span class="nf">calculateHash</span><span class="p">(</span><span class="nx">insertValue</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 insertValue to the array </span>
</span></span><span class="line"><span class="cl">  <span class="c1">// present at &#34;hash&#34; key</span>
</span></span><span class="line"><span class="cl">  <span class="nx">hm</span><span class="p">.</span><span class="nx">table</span><span class="p">[</span><span class="nx">hash</span><span class="p">]</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">hm</span><span class="p">.</span><span class="nx">table</span><span class="p">[</span><span class="nx">hash</span><span class="p">],</span> <span class="nx">insertValue</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="p">(</span><span class="nx">hm</span> <span class="o">*</span><span class="nx">HashMap</span><span class="p">)</span> <span class="nf">search</span><span class="p">(</span><span class="nx">searchValue</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></span><span class="line"><span class="cl">  <span class="c1">// Narrow down the search to the array stored </span>
</span></span><span class="line"><span class="cl">  <span class="c1">// at the &#34;hash&#34; key</span>
</span></span><span class="line"><span class="cl">  <span class="nx">searchSpace</span> <span class="o">:=</span> <span class="nx">hm</span><span class="p">.</span><span class="nx">table</span><span class="p">[</span><span class="nf">calculateHash</span><span class="p">(</span><span class="nx">searchValue</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Search for searchValue in the array stored </span>
</span></span><span class="line"><span class="cl">  <span class="c1">// at &#34;hash&#34; key</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">searchSpace</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="p">(</span><span class="nx">searchValue</span> <span class="o">==</span> <span class="nx">searchSpace</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">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></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">hm</span> <span class="o">:=</span> <span class="nx">HashMap</span><span class="p">{</span><span class="nx">table</span><span class="p">:</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="nx">hm</span><span class="p">.</span><span class="nf">insert</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">hm</span><span class="p">.</span><span class="nf">insert</span><span class="p">(</span><span class="mi">12</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">hm</span><span class="p">.</span><span class="nf">insert</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">hm</span><span class="p">.</span><span class="nf">insert</span><span class="p">(</span><span class="mi">65</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">hm</span><span class="p">.</span><span class="nf">insert</span><span class="p">(</span><span class="mi">67</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">hm</span><span class="p">.</span><span class="nf">insert</span><span class="p">(</span><span class="mi">55</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;HashMap:&#34;</span><span class="p">,</span> <span class="nx">hm</span><span class="p">.</span><span class="nx">table</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">searchValue1</span> <span class="o">:=</span> <span class="mi">55</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;Searching for&#34;</span><span class="p">,</span> <span class="nx">searchValue1</span><span class="p">,</span> <span class="s">&#34;in HashMap:&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="nx">hm</span><span class="p">.</span><span class="nf">search</span><span class="p">(</span><span class="nx">searchValue1</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">searchValue2</span> <span class="o">:=</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;Searching for&#34;</span><span class="p">,</span> <span class="nx">searchValue2</span><span class="p">,</span> <span class="s">&#34;in HashMap:&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="nx">hm</span><span class="p">.</span><span class="nf">search</span><span class="p">(</span><span class="nx">searchValue2</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">// HashMap: map[1:[1] 2:[12] 3:[23] 5:[65 55] 7:[67]]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Searching for 55 in HashMap: true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Searching for 2 in HashMap: false</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<h1 id="resources">Resources</h1>
<p><a href="https://www.freecodecamp.org/news/hash-tables/" target="_blank">Hash Table Explained: What it Is and How to Implement It</a><br>
<a href="https://www.freecodecamp.org/news/java-list-tutorial-util-list-api-example/" target="_blank">Java List Methods Tutorial – Util List API Example</a><br>
<a href="https://www.freecodecamp.org/news/efficient-string-building-in-javascript/" target="_blank">How to Work with Strings in JavaScript – Tips for Efficient String Concatenation</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Time Complexity</title>
      <link>http://www.avni.sh/posts/computer-science/interview-preparation/time-complexity/</link>
      <pubDate>Fri, 22 Sep 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/computer-science/interview-preparation/time-complexity/</guid>
      <description>The time complexity metric is used to assess an algorithm&amp;#39;s performance on scale</description>
      <content:encoded><![CDATA[<p>While programming allows us to create virtually anything, the true test of performance arises when we deploy the same code on a significantly larger scale.</p>
<p><strong>Time Complexity</strong> ($T(n)$) is a function that estimates the execution time of an algorithm given the amount of data to be processed as its input ($n$). It is a common benchmark used to measure an algorithm&rsquo;s performance.</p>
<h1 id="bounds-of-time-complexity">Bounds of Time Complexity</h1>
<p>The output of the time complexity function will be a close estimate of an algorithm&rsquo;s runtime given the size of its input but it does not consider other characteristics of the input that could affect its runtime.</p>
<p>Some algorithms perform best when the input data is sorted in ascending order and worst when sorted in descending order or vice versa. That&rsquo;s why we have bounds on the time complexity function, a range starting from best-case to worst-case execution time for the same input size.</p>
<h2 id="upper-bound-o">Upper Bound ($O$)</h2>
<p>The &ldquo;big O&rdquo; ($O$) represents the upper bound (worst-case scenario) on the time complexity function i.e. for an input of size $n$ the algorithm can&rsquo;t take more than $O(n)$ time to provide  the solution.</p>
<h2 id="lower-bound-omega">Lower Bound ($\Omega$)</h2>
<p>The &ldquo;big Omega&rdquo; ($\Omega$) represents the lower bound (best-case scenario) on the time complexity function i.e. for an input of size $n$ the algorithm can&rsquo;t take less than $O(n)$ time to provide the solution.</p>
<h2 id="expected-case-theta">Expected Case ($\Theta$)</h2>
<p>The &ldquo;big Theta&rdquo; ($\Theta$) represents the case where both upper and lower bounds are at the same point (expected case scenario) i.e. for an input of size $n$ the algorithm&rsquo;s time complexity couldn&rsquo;t get better or worse than $\Theta(n)$.</p>
<p>Big $O$ is the preferred time complexity function for an algorithm&rsquo;s runtime analysis because it provides a conservative estimate and its result is independent of factors like hardware performance, characteristics of data, compiler optimization, etc.</p>
<p>While choosing among different algorithms to perform a task we aim for the lowest worst-case time complexity.</p>
<h1 id="common-time-complexity-functions">Common Time Complexity Functions</h1>
<p>The runtime of recurring patterns in programming could be represented by common time complexity functions. This helps us estimate the time complexity of the entire program.</p>
<h2 id="constant-time-complexity-o1">Constant Time Complexity $O(1)$</h2>
<p align="center"><img src="Constant.drawio.png" alt="Scaling an Algorithm with Constant Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Constant Time Complexity</small></p>
<p>An algorithm has <strong>constant time complexity</strong> when its runtime isn&rsquo;t affected by the amount of data passed as input. An example would be a function that performs addition on its two inputs.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<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">addition</span><span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">y</span> <span class="kt">int</span><span class="p">)</span> <span class="p">(</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// The size of x and y does not affect</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// the runtime of this function</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">x</span><span class="o">+</span><span class="nx">y</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">x</span> <span class="o">:=</span> <span class="mi">2000</span>
</span></span><span class="line"><span class="cl">	<span class="nx">y</span> <span class="o">:=</span> <span class="mi">2132</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;Addition of&#34;</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="s">&#34;and&#34;</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="s">&#34;is:&#34;</span><span class="p">,</span> <span class="nf">addition</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</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">// Result</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Addition of 2000 and 2132 is: 4132</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>The above example is implemented in the <a href="/posts/go/go-programming-language/" target="_blank">Go Programming Language</a>.</p>
<h2 id="linear-time-complexity-on">Linear Time Complexity $O(n)$</h2>
<p align="center"><img src="Linear.drawio.png" alt="Scaling an Algorithm with Linear Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Linear Time Complexity</small></p>
<p>For some algorithms the execution time is directly proportional to the size of its input, such algorithms are categorized in <strong>linear time complexity</strong>.</p>
<p>An example would be a loop that iterates over elements in a list and returns its sum.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span></code></pre></td>
<td class="lntd">
<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">arraySum</span><span class="p">(</span><span class="nx">arr</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">sum</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="c1">// Time taken to complete this loop</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// will be directly proportional to the</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// size of arr</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">element</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">arr</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">sum</span> <span class="o">+=</span> <span class="nx">element</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">sum</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">arrayExample</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">2</span><span class="p">,</span> <span class="mi">1</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;Sum of the array:&#34;</span><span class="p">,</span> <span class="nx">arrayExample</span><span class="p">,</span> <span class="s">&#34;will be&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">arraySum</span><span class="p">(</span><span class="nx">arrayExample</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">// Sum of the array: [1 2 3 2 1 1] will be 10</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>If we call the function <code>arraySum()</code> twice then the time complexity of the program will be $O(2n)$. However, we can generalize it to $O(n)$ because even though the program performs two passes over the array, the growth rate in runtime remains linear with respect to its input size.</p>
<h2 id="quadratic-time-complexity-on2">Quadratic Time Complexity $O(n^2)$</h2>
<p align="center"><img src="Quadratic.drawio.png" alt="Scaling an Algorithm with Quadratic Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Quadratic Time Complexity</small></p>
<p>Similar to linear time complexity, algorithms exhibiting quadratic time complexity experience execution times that are directly proportional to the square of the number of inputs. These algorithms scale relatively slower (longer execution time) compared to linear time complexity algorithms like $O(n)$, $O(2n)$, etc.</p>
<p>For example, a program that displays pair combinations of all elements in an array using nested loops.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span></code></pre></td>
<td class="lntd">
<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">showCombinations</span><span class="p">(</span><span class="nx">arr</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 inner loop is executed n (size of arr) times.</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Thus, the total time complexity of this function will be O(n*n)</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">element1</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">arr</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 the inner loop</span>
</span></span><span class="line"><span class="cl">		<span class="c1">// is directly proportional to the size of arr i.e. O(n)</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">element2</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">arr</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">element1</span> <span class="o">!=</span> <span class="nx">element2</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;Combination:&#34;</span><span class="p">,</span> <span class="nx">element1</span><span class="p">,</span> <span class="s">&#34;and&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                                            <span class="nx">element2</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="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="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">arrayExample</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">123</span><span class="p">,</span> <span class="mi">1234</span><span class="p">,</span> <span class="mi">456</span><span class="p">,</span> <span class="mi">5462</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;Pair combination of all elements in the array: &#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                <span class="nx">arrayExample</span><span class="p">,</span> <span class="s">&#34;are:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nf">showCombinations</span><span class="p">(</span><span class="nx">arrayExample</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">// Pair combination of all elements in the array:  [123 1234 456 5462] are:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 123 and 1234</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 123 and 456</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 123 and 5462</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 1234 and 123</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 1234 and 456</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 1234 and 5462</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 456 and 123</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 456 and 1234</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 456 and 5462</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 5462 and 123</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 5462 and 1234</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 5462 and 456</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="exponential-time-complexity-o2n">Exponential Time Complexity $O(2^n)$</h2>
<p align="center"><img src="Exponential.drawio.png" alt="Scaling an Algorithm with Exponential Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Exponential Time Complexity</small></p>
<p>A brute-force algorithm to find the $n$th number in the Fibonacci series has exponential time complexity because it branches in two recursive calls on every iteration.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span></code></pre></td>
<td class="lntd">
<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">fibonacci</span><span class="p">(</span><span class="nx">n</span> <span class="kt">int</span><span class="p">)</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">if</span> <span class="nx">n</span> <span class="o">&lt;=</span> <span class="mi">1</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="nx">n</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 recursive calls will branch</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// further in two more calls</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="nx">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="nx">n</span><span class="o">-</span><span class="mi">2</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 class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">n</span> <span class="o">:=</span> <span class="mi">10</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;The&#34;</span><span class="p">,</span> <span class="nx">n</span><span class="p">,</span> <span class="s">&#34;th Fibonacci number is:&#34;</span><span class="p">,</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="nx">n</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">// The 10 th Fibonacci number is: 55</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Algorithms with $O(2^n)$, $O(e^n)$, $O(10^n)$, etc. time complexities are grouped under <strong>exponential</strong> time. Among these, the $2^n$ function has widespread use in computer science like Moore&rsquo;s law or to find the number of memory addresses possible with $n$ bits arrangement.</p>
<blockquote>
<p>The number of transistors in an Integrated Circuit (IC) doubles about every two years</p>
<p><cite><a href="https://en.wikipedia.org/wiki/Gordon_Moore" target=_blank>Gordon Moore</a>, Co-Founder of Intel, 1965</cite></p></blockquote>
<h2 id="logarithmic-time-complexity-olog_2n">Logarithmic Time Complexity $O(\log_2{n})$</h2>
<p align="center"><img src="Logarithmic.drawio.png" alt="Scaling an Algorithm with Logarithmic Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Logarithmic Time Complexity</small></p>
<p>The $\log_2{n}$ is the inverse of function $2^n$. The following example of a number guessing game has $O(\log_2{n})$ time complexity because it cuts the search space by half on each iteration.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span><span class="lnt">71
</span><span class="lnt">72
</span><span class="lnt">73
</span><span class="lnt">74
</span><span class="lnt">75
</span><span class="lnt">76
</span><span class="lnt">77
</span><span class="lnt">78
</span><span class="lnt">79
</span><span class="lnt">80
</span><span class="lnt">81
</span><span class="lnt">82
</span><span class="lnt">83
</span><span class="lnt">84
</span></code></pre></td>
<td class="lntd">
<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">guessNumber</span><span class="p">(</span><span class="nx">low</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">high</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="c1">// Returns the middle number in a range from low to high</span>
</span></span><span class="line"><span class="cl">	<span class="nx">mid</span> <span class="o">:=</span> <span class="p">(</span><span class="nx">high</span><span class="o">+</span><span class="nx">low</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">mid</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">low</span> <span class="o">:=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="nx">high</span> <span class="o">:=</span> <span class="mi">100</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;Think of a number between&#34;</span><span class="p">,</span> <span class="nx">low</span><span class="p">,</span> <span class="s">&#34;and&#34;</span><span class="p">,</span> <span class="nx">high</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">numQuestions</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="k">for</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="nx">answer1</span><span class="p">,</span> <span class="nx">answer2</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">            <span class="nx">guessedNumber</span> <span class="o">:=</span> <span class="nf">guessNumber</span><span class="p">(</span><span class="nx">low</span><span class="p">,</span> <span class="nx">high</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;I guessed:&#34;</span><span class="p">,</span> <span class="nx">guessedNumber</span><span class="p">,</span> <span class="s">&#34;Is that correct?&#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;1) Yes&#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;2) No&#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">Print</span><span class="p">(</span><span class="s">&#34;Enter your response (1 or 2):&#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">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">answer1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="k">switch</span><span class="p">(</span><span class="nx">answer1</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">                <span class="k">case</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;It took me&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                                <span class="nx">numQuestions</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                                <span class="s">&#34;questions to guess your number&#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">// It will take maximum log(n) questions to guess a number</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">// Where n is size of the number range in this case 100</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;Thanks for playing&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                    <span class="k">return</span>
</span></span><span class="line"><span class="cl">                
</span></span><span class="line"><span class="cl">                <span class="k">case</span> <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">numQuestions</span> <span class="o">+=</span> <span class="mi">1</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;Is it higher or lower than&#34;</span><span class="p">,</span> <span class="nx">guessedNumber</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;1) Higher&#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;2) Lower&#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">Print</span><span class="p">(</span><span class="s">&#34;Enter your response (1 or 2):&#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">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">answer2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="k">switch</span><span class="p">(</span><span class="nx">answer2</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">                        <span class="k">case</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                            <span class="c1">// Halving the search space </span>
</span></span><span class="line"><span class="cl">                            <span class="c1">// to exclude number lower than guessed</span>
</span></span><span class="line"><span class="cl">                            <span class="nx">low</span> <span class="p">=</span> <span class="nx">guessedNumber</span>
</span></span><span class="line"><span class="cl">                        <span class="k">case</span> <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                            <span class="c1">// Halving the search space </span>
</span></span><span class="line"><span class="cl">                            <span class="c1">// to exclude number higher than guessed</span>
</span></span><span class="line"><span class="cl">                            <span class="nx">high</span> <span class="p">=</span> <span class="nx">guessedNumber</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="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Think of a number between 1 and 100</span>
</span></span><span class="line"><span class="cl"><span class="c1">// I guessed: 50 Is that correct?</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1) Yes</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2) No</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter your response (1 or 2):2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Is it higher or lower than 50</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1) Higher</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2) Lower</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter your response (1 or 2):2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// I guessed: 24 Is that correct?</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1) Yes</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2) No</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter your response (1 or 2):2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Is it higher or lower than 24</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1) Higher</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2) Lower</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter your response (1 or 2):1</span>
</span></span><span class="line"><span class="cl"><span class="c1">// I guessed: 37 Is that correct?</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1) Yes</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2) No</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter your response (1 or 2):1</span>
</span></span><span class="line"><span class="cl"><span class="c1">// It took me 2 questions to guess your number</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Thanks for playing</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="linearithmic-time-complexity-on-log_2-n">Linearithmic Time Complexity $O(n \log_2 n)$</h2>
<p align="center"><img src="Linearithmic.drawio.png" alt="Scaling an Algorithm with Linearithmic Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Linearithmic Time Complexity</small></p>
<p><a href="/posts/computer-science/interview-preparation/merge-sort/" target="_blank">Merge Sort</a>, <a href="/posts/computer-science/interview-preparation/quick-sort/" target="_blank">Quick Sort</a>, and <a href="/posts/computer-science/interview-preparation/heap-sort/" target="_blank">Heap Sort</a> are some examples of algorithms with <strong>linearithmic time complexity</strong>.</p>
<h2 id="factorial-time-complexity-on">Factorial Time Complexity $O(n!)$</h2>
<p align="center"><img src="Factorial.drawio.png" alt="Scaling an Algorithm with Factorial Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Factorial Time Complexity</small></p>
<p>The solution to the <a href="/posts/computer-science/interview-preparation/travelling-salesman-problem/" target="_blank">Travelling Salesman Problem</a> has factorial time complexity.</p>
<h1 id="comparing-algorithm-performance-using-time-complexity">Comparing Algorithm Performance Using Time Complexity</h1>
<p>Let&rsquo;s say we&rsquo;ve been provided with a set of algorithms and we have to choose the one which scales best with respect to the growing input size.</p>
<p>Assuming the output of the function $O()$ is an algorithm&rsquo;s worst-case execution time in seconds. As we increase the input size from $1$ to $100$ the runtime of algorithms will scale as follows:</p>
<table>
  <thead>
      <tr>
          <th>Algorithm</th>
          <th>Time Complexity</th>
          <th>Runtime ($n=2$)</th>
          <th>Runtime ($n=10$)</th>
          <th>Runtime ($n=100$)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Logarithmic</td>
          <td>$O(log_2{n})$</td>
          <td>$1$s</td>
          <td>$3.321$s</td>
          <td>$6.644$s</td>
      </tr>
      <tr>
          <td>Linear</td>
          <td>$O(n)$</td>
          <td>$2$s</td>
          <td>$10$s</td>
          <td>$100$s</td>
      </tr>
      <tr>
          <td>Linearithmic</td>
          <td>$O(nlog_2{n})$</td>
          <td>$2$s</td>
          <td>$33.21$s</td>
          <td>$664.4$s</td>
      </tr>
      <tr>
          <td>Quadratic</td>
          <td>$O(n^2)$</td>
          <td>$4$s</td>
          <td>$100$s</td>
          <td>$10000$s</td>
      </tr>
      <tr>
          <td>Exponential</td>
          <td>$O(2^n)$</td>
          <td>$4$s</td>
          <td>$1024$s</td>
          <td>$1.26 \times 10^{30}$s</td>
      </tr>
      <tr>
          <td>Factorial</td>
          <td>$O(n!)$</td>
          <td>$2$s</td>
          <td>$3628800$s</td>
          <td>$9.33 \times 10^{157}$s</td>
      </tr>
  </tbody>
</table>
<p>With the same amount of computational power and input size ($100$), an algorithm with $O(2^n)$ time complexity will finish the task in $3.99 \times 10^{22}$ years. In contrast, an algorithm with $O(n \log_2{n})$ time complexity will take only $664.4$ seconds. This illustrates the importance of performing a time complexity analysis of all possible solutions while solving a problem.</p>
<p>If we plot the worst-case time complexity $O(n)$ against the input size $n$ we can see that algorithms with logarithmic or linear time complexity scale better relative to algorithms with quadratic or exponential time complexity i.e. their runtime grows relatively slow as the input size increases.</p>
<p align="center"><img src="Time Complexity.drawio.png" alt="Time Complexity Comparison of Algorithms"></p>
<p align="center"><small>Time Complexity Comparison of Algorithms</small></p>
<hr>
<p>Thank you for taking the time to read this blog post! Have questions, feedback or want to discuss this topic? Feel free to reach out at <a href="mailto:blog@avni.sh"><a href="mailto:blog@avni.sh">blog@avni.sh</a></a>.</p>
<p>If you found this content valuable and would like to stay updated with my latest posts, consider subscribing to my <a href="https://www.avni.sh/index.xml" target="_blank">RSS Feed</a>.</p>
<h1 id="resources">Resources</h1>
<p><a href="https://www.freecodecamp.org/news/big-theta-and-asymptotic-notation-explained/" target="_blank">Big Theta and Asymptotic Notation Explained</a><br>
<a href="http://watson.latech.edu/book/future/futureMoores1.html" target="_blank">What is Moore&rsquo;s Law</a><br>
<a href="https://www.khanacademy.org/math/algebra2/x2ec2f6f830c9fb89:logs/x2ec2f6f830c9fb89:log-intro/v/plotting-exponential-logarithm" target="_blank">Relationship between exponentials &amp; logarithms</a><br>
<a href="https://www.khanacademy.org/computing/computer-science/algorithms/recursive-algorithms/a/the-factorial-function" target="_blank">The factorial function</a></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
