|
22415 | 22415 | <ul class="md-nav__list"> |
22416 | 22416 |
|
22417 | 22417 | <li class="md-nav__item"> |
22418 | | - <a href="#solution-1" class="md-nav__link"> |
| 22418 | + <a href="#solution-1-hash-table-trie" class="md-nav__link"> |
22419 | 22419 | <span class="md-ellipsis"> |
22420 | | - Solution 1 |
| 22420 | + Solution 1: Hash Table + Trie |
22421 | 22421 | </span> |
22422 | 22422 | </a> |
22423 | 22423 |
|
@@ -87176,8 +87176,17 @@ <h2 id="description">Description</h2> |
87176 | 87176 | <h2 id="solutions">Solutions</h2> |
87177 | 87177 | <!-- solution:start --> |
87178 | 87178 |
|
87179 | | -<h3 id="solution-1">Solution 1</h3> |
87180 | | -<div class="tabbed-set tabbed-alternate" data-tabs="1:5"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Python3</label><label for="__tabbed_1_2">Java</label><label for="__tabbed_1_3">C++</label><label for="__tabbed_1_4">Go</label><label for="__tabbed_1_5">TypeScript</label></div> |
| 87179 | +<h3 id="solution-1-hash-table-trie">Solution 1: Hash Table + Trie</h3> |
| 87180 | +<p>We use a hash table <span class="arithmatex">\(d\)</span> to store key-value pairs and a trie <span class="arithmatex">\(t\)</span> to store the prefix sums of the key-value pairs. Each node in the trie contains two pieces of information:</p> |
| 87181 | +<ul> |
| 87182 | +<li><code>val</code>: the total sum of the values of the key-value pairs with this node as the prefix</li> |
| 87183 | +<li><code>children</code>: an array of length <span class="arithmatex">\(26\)</span> that stores the child nodes of this node</li> |
| 87184 | +</ul> |
| 87185 | +<p>When inserting a key-value pair <span class="arithmatex">\((key, val)\)</span>, we first check if the key exists in the hash table. If it does, the <code>val</code> of each node in the trie needs to subtract the original value of the key and then add the new value. If it does not exist, the <code>val</code> of each node in the trie needs to add the new value.</p> |
| 87186 | +<p>When querying the prefix sum, we start from the root node of the trie and traverse the prefix string. If the current node's child nodes do not contain the character, it means the prefix does not exist in the trie, and we return <span class="arithmatex">\(0\)</span>. Otherwise, we continue to traverse the next character until we finish traversing the prefix string and return the <code>val</code> of the current node.</p> |
| 87187 | +<p>In terms of time complexity, the time complexity of inserting a key-value pair is <span class="arithmatex">\(O(n)\)</span>, where <span class="arithmatex">\(n\)</span> is the length of the key. The time complexity of querying the prefix sum is <span class="arithmatex">\(O(m)\)</span>, where <span class="arithmatex">\(m\)</span> is the length of the prefix.</p> |
| 87188 | +<p>The space complexity is <span class="arithmatex">\(O(n \times m \times C)\)</span>, where <span class="arithmatex">\(n\)</span> and <span class="arithmatex">\(m\)</span> are the number of keys and the maximum length of the keys, respectively; and <span class="arithmatex">\(C\)</span> is the size of the character set, which is <span class="arithmatex">\(26\)</span> in this problem.</p> |
| 87189 | +<div class="tabbed-set tabbed-alternate" data-tabs="1:6"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><input id="__tabbed_1_6" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Python3</label><label for="__tabbed_1_2">Java</label><label for="__tabbed_1_3">C++</label><label for="__tabbed_1_4">Go</label><label for="__tabbed_1_5">TypeScript</label><label for="__tabbed_1_6">JavaScript</label></div> |
87181 | 87190 | <div class="tabbed-content"> |
87182 | 87191 | <div class="tabbed-block"> |
87183 | 87192 | <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span> |
@@ -87715,6 +87724,130 @@ <h3 id="solution-1">Solution 1</h3> |
87715 | 87724 | <span class="w"> </span><span class="p">}</span> |
87716 | 87725 | <span class="p">}</span> |
87717 | 87726 |
|
| 87727 | +<span class="cm">/**</span> |
| 87728 | +<span class="cm"> * Your MapSum object will be instantiated and called as such:</span> |
| 87729 | +<span class="cm"> * var obj = new MapSum()</span> |
| 87730 | +<span class="cm"> * obj.insert(key,val)</span> |
| 87731 | +<span class="cm"> * var param_2 = obj.sum(prefix)</span> |
| 87732 | +<span class="cm"> */</span> |
| 87733 | +</code></pre></div></td></tr></table></div> |
| 87734 | +</div> |
| 87735 | +<div class="tabbed-block"> |
| 87736 | +<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span> |
| 87737 | +<span class="normal"> 2</span> |
| 87738 | +<span class="normal"> 3</span> |
| 87739 | +<span class="normal"> 4</span> |
| 87740 | +<span class="normal"> 5</span> |
| 87741 | +<span class="normal"> 6</span> |
| 87742 | +<span class="normal"> 7</span> |
| 87743 | +<span class="normal"> 8</span> |
| 87744 | +<span class="normal"> 9</span> |
| 87745 | +<span class="normal">10</span> |
| 87746 | +<span class="normal">11</span> |
| 87747 | +<span class="normal">12</span> |
| 87748 | +<span class="normal">13</span> |
| 87749 | +<span class="normal">14</span> |
| 87750 | +<span class="normal">15</span> |
| 87751 | +<span class="normal">16</span> |
| 87752 | +<span class="normal">17</span> |
| 87753 | +<span class="normal">18</span> |
| 87754 | +<span class="normal">19</span> |
| 87755 | +<span class="normal">20</span> |
| 87756 | +<span class="normal">21</span> |
| 87757 | +<span class="normal">22</span> |
| 87758 | +<span class="normal">23</span> |
| 87759 | +<span class="normal">24</span> |
| 87760 | +<span class="normal">25</span> |
| 87761 | +<span class="normal">26</span> |
| 87762 | +<span class="normal">27</span> |
| 87763 | +<span class="normal">28</span> |
| 87764 | +<span class="normal">29</span> |
| 87765 | +<span class="normal">30</span> |
| 87766 | +<span class="normal">31</span> |
| 87767 | +<span class="normal">32</span> |
| 87768 | +<span class="normal">33</span> |
| 87769 | +<span class="normal">34</span> |
| 87770 | +<span class="normal">35</span> |
| 87771 | +<span class="normal">36</span> |
| 87772 | +<span class="normal">37</span> |
| 87773 | +<span class="normal">38</span> |
| 87774 | +<span class="normal">39</span> |
| 87775 | +<span class="normal">40</span> |
| 87776 | +<span class="normal">41</span> |
| 87777 | +<span class="normal">42</span> |
| 87778 | +<span class="normal">43</span> |
| 87779 | +<span class="normal">44</span> |
| 87780 | +<span class="normal">45</span> |
| 87781 | +<span class="normal">46</span> |
| 87782 | +<span class="normal">47</span> |
| 87783 | +<span class="normal">48</span> |
| 87784 | +<span class="normal">49</span> |
| 87785 | +<span class="normal">50</span> |
| 87786 | +<span class="normal">51</span> |
| 87787 | +<span class="normal">52</span> |
| 87788 | +<span class="normal">53</span> |
| 87789 | +<span class="normal">54</span> |
| 87790 | +<span class="normal">55</span> |
| 87791 | +<span class="normal">56</span> |
| 87792 | +<span class="normal">57</span> |
| 87793 | +<span class="normal">58</span> |
| 87794 | +<span class="normal">59</span> |
| 87795 | +<span class="normal">60</span> |
| 87796 | +<span class="normal">61</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="kd">class</span><span class="w"> </span><span class="nx">Trie</span><span class="w"> </span><span class="p">{</span> |
| 87797 | +<span class="w"> </span><span class="kr">constructor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> |
| 87798 | +<span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">children</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="mf">26</span><span class="p">);</span> |
| 87799 | +<span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span> |
| 87800 | +<span class="w"> </span><span class="p">}</span> |
| 87801 | + |
| 87802 | +<span class="w"> </span><span class="nx">insert</span><span class="p">(</span><span class="nx">w</span><span class="p">,</span><span class="w"> </span><span class="nx">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> |
| 87803 | +<span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">;</span> |
| 87804 | +<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">c</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">w</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> |
| 87805 | +<span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">c</span><span class="p">.</span><span class="nx">charCodeAt</span><span class="p">(</span><span class="mf">0</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mf">97</span><span class="p">;</span> |
| 87806 | +<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">node</span><span class="p">.</span><span class="nx">children</span><span class="p">[</span><span class="nx">i</span><span class="p">])</span><span class="w"> </span><span class="p">{</span> |
| 87807 | +<span class="w"> </span><span class="nx">node</span><span class="p">.</span><span class="nx">children</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">Trie</span><span class="p">();</span> |
| 87808 | +<span class="w"> </span><span class="p">}</span> |
| 87809 | +<span class="w"> </span><span class="nx">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">node</span><span class="p">.</span><span class="nx">children</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span> |
| 87810 | +<span class="w"> </span><span class="nx">node</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="nx">x</span><span class="p">;</span> |
| 87811 | +<span class="w"> </span><span class="p">}</span> |
| 87812 | +<span class="w"> </span><span class="p">}</span> |
| 87813 | + |
| 87814 | +<span class="w"> </span><span class="nx">search</span><span class="p">(</span><span class="nx">w</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> |
| 87815 | +<span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">;</span> |
| 87816 | +<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">c</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">w</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> |
| 87817 | +<span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">c</span><span class="p">.</span><span class="nx">charCodeAt</span><span class="p">(</span><span class="mf">0</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mf">97</span><span class="p">;</span> |
| 87818 | +<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">node</span><span class="p">.</span><span class="nx">children</span><span class="p">[</span><span class="nx">i</span><span class="p">])</span><span class="w"> </span><span class="p">{</span> |
| 87819 | +<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span> |
| 87820 | +<span class="w"> </span><span class="p">}</span> |
| 87821 | +<span class="w"> </span><span class="nx">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">node</span><span class="p">.</span><span class="nx">children</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span> |
| 87822 | +<span class="w"> </span><span class="p">}</span> |
| 87823 | +<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">node</span><span class="p">.</span><span class="nx">val</span><span class="p">;</span> |
| 87824 | +<span class="w"> </span><span class="p">}</span> |
| 87825 | +<span class="p">}</span> |
| 87826 | + |
| 87827 | +<span class="kd">var</span><span class="w"> </span><span class="nx">MapSum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kd">function</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">{</span> |
| 87828 | +<span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">d</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nb">Map</span><span class="p">();</span> |
| 87829 | +<span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">t</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">Trie</span><span class="p">();</span> |
| 87830 | +<span class="p">};</span> |
| 87831 | + |
| 87832 | +<span class="cm">/**</span> |
| 87833 | +<span class="cm"> * @param {string} key</span> |
| 87834 | +<span class="cm"> * @param {number} val</span> |
| 87835 | +<span class="cm"> * @return {void}</span> |
| 87836 | +<span class="cm"> */</span> |
| 87837 | +<span class="nx">MapSum</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">insert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kd">function</span><span class="w"> </span><span class="p">(</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> |
| 87838 | +<span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">val</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">d</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="o">??</span><span class="w"> </span><span class="mf">0</span><span class="p">);</span> |
| 87839 | +<span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">d</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">val</span><span class="p">);</span> |
| 87840 | +<span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">t</span><span class="p">.</span><span class="nx">insert</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">x</span><span class="p">);</span> |
| 87841 | +<span class="p">};</span> |
| 87842 | + |
| 87843 | +<span class="cm">/**</span> |
| 87844 | +<span class="cm"> * @param {string} prefix</span> |
| 87845 | +<span class="cm"> * @return {number}</span> |
| 87846 | +<span class="cm"> */</span> |
| 87847 | +<span class="nx">MapSum</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">sum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kd">function</span><span class="w"> </span><span class="p">(</span><span class="nx">prefix</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> |
| 87848 | +<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">t</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="nx">prefix</span><span class="p">);</span> |
| 87849 | +<span class="p">};</span> |
| 87850 | + |
87718 | 87851 | <span class="cm">/**</span> |
87719 | 87852 | <span class="cm"> * Your MapSum object will be instantiated and called as such:</span> |
87720 | 87853 | <span class="cm"> * var obj = new MapSum()</span> |
@@ -87756,6 +87889,11 @@ <h3 id="solution-1">Solution 1</h3> |
87756 | 87889 |
|
87757 | 87890 | <nav> |
87758 | 87891 |
|
| 87892 | + <a href="https://github.com/acbin" class="md-author" title="@acbin"> |
| 87893 | + |
| 87894 | + <img src="https://avatars.githubusercontent.com/u/44314231?v=4&size=72" alt="acbin"> |
| 87895 | + </a> |
| 87896 | + |
87759 | 87897 | <a href="https://github.com/yanglbme" class="md-author" title="@yanglbme"> |
87760 | 87898 |
|
87761 | 87899 | <img src="https://avatars.githubusercontent.com/u/21008209?v=4&size=72" alt="yanglbme"> |
|
0 commit comments