<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.5">Jekyll</generator><link href="https://jooncco.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://jooncco.github.io/" rel="alternate" type="text/html" /><updated>2024-03-16T09:23:40+00:00</updated><id>https://jooncco.github.io/feed.xml</id><title type="html">jooncco.github.io</title><subtitle>Knowledge base of full stack engineer jooncco.</subtitle><author><name>Junha Jeong</name></author><entry><title type="html">[Leetcode] 42. Trapping Rain Water explained</title><link href="https://jooncco.github.io/competitive-programming/leetcode-42/" rel="alternate" type="text/html" title="[Leetcode] 42. Trapping Rain Water explained" /><published>2022-09-18T00:00:00+00:00</published><updated>2022-09-18T13:33:08+00:00</updated><id>https://jooncco.github.io/competitive-programming/leetcode-42</id><content type="html" xml:base="https://jooncco.github.io/competitive-programming/leetcode-42/"><![CDATA[<h2 id="problem">Problem</h2>

<p><a href="https://leetcode.com/problems/bag-of-tokens/">42. Trapping Rain Water</a></p>

<h2 id="approach">Approach</h2>

<p>Find water levels of each index.<br />
The answer is</p>

\[\sum\_{k=0}^{n-1} max ( 0 , waterLevel[k] - height[k] )\]

<p>How can we find water levels?</p>

<p>We keep <code class="language-plaintext highlighter-rouge">(height,index)</code> in a <code class="language-plaintext highlighter-rouge">stack</code>.<br />
For i = [0, … n-1] do:</p>

<ol>
  <li>While <code class="language-plaintext highlighter-rouge">stack</code> is not empty and <code class="language-plaintext highlighter-rouge">stack.top.height</code> \(\le\) <code class="language-plaintext highlighter-rouge">height[i]</code>, update water levels in range <code class="language-plaintext highlighter-rouge">(stack.top.index,i)</code> to <code class="language-plaintext highlighter-rouge">stack.top.height</code> and stack.pop().</li>
  <li>If <code class="language-plaintext highlighter-rouge">stack</code> is not empty and <code class="language-plaintext highlighter-rouge">stack.top.height</code> \(\gt\) <code class="language-plaintext highlighter-rouge">height[i]</code>, update water levels in range <code class="language-plaintext highlighter-rouge">(stack.top.index,i)</code> to <code class="language-plaintext highlighter-rouge">height[i]</code>. <strong>Do not stack.pop()</strong>.</li>
</ol>

<p>After above process, sum up water volumes.</p>

<h2 id="code">Code</h2>

<p><img src="/public/images/leetcode-42-result.png" /></p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Solution</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="kt">int</span> <span class="nf">trap</span><span class="o">(</span><span class="kt">int</span><span class="o">[]</span> <span class="n">height</span><span class="o">)</span> <span class="o">{</span>
        <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">height</span><span class="o">.</span><span class="na">length</span><span class="o">;</span>
        <span class="nc">Stack</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">[]&gt;</span> <span class="n">walls</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Stack</span><span class="o">&lt;&gt;();</span>
        <span class="kt">int</span><span class="o">[]</span> <span class="n">waterLevels</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">n</span><span class="o">];</span>
        <span class="c1">// find water levels.</span>
        <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
            <span class="k">if</span> <span class="o">(</span><span class="n">height</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
                <span class="k">while</span> <span class="o">(!</span><span class="n">walls</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">()</span> <span class="o">&amp;&amp;</span> <span class="n">walls</span><span class="o">.</span><span class="na">peek</span><span class="o">()[</span><span class="mi">0</span><span class="o">]</span> <span class="o">&lt;=</span> <span class="n">height</span><span class="o">[</span><span class="n">i</span><span class="o">])</span> <span class="o">{</span>
                    <span class="nc">Integer</span><span class="o">[]</span> <span class="n">wall</span><span class="o">=</span> <span class="n">walls</span><span class="o">.</span><span class="na">pop</span><span class="o">();</span>
                    <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="o">;</span> <span class="n">j</span> <span class="o">&gt;</span> <span class="n">wall</span><span class="o">[</span><span class="mi">1</span><span class="o">];</span> <span class="o">--</span><span class="n">j</span><span class="o">)</span> <span class="n">waterLevels</span><span class="o">[</span><span class="n">j</span><span class="o">]=</span> <span class="n">wall</span><span class="o">[</span><span class="mi">0</span><span class="o">];</span>
                <span class="o">}</span>
                <span class="k">if</span> <span class="o">(!</span><span class="n">walls</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">()</span> <span class="o">&amp;&amp;</span> <span class="n">walls</span><span class="o">.</span><span class="na">peek</span><span class="o">()[</span><span class="mi">0</span><span class="o">]</span> <span class="o">&gt;</span> <span class="n">height</span><span class="o">[</span><span class="n">i</span><span class="o">])</span> <span class="o">{</span>
                    <span class="nc">Integer</span><span class="o">[]</span> <span class="n">wall</span><span class="o">=</span> <span class="n">walls</span><span class="o">.</span><span class="na">peek</span><span class="o">();</span>
                    <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="o">;</span> <span class="n">j</span> <span class="o">&gt;</span> <span class="n">wall</span><span class="o">[</span><span class="mi">1</span><span class="o">];</span> <span class="o">--</span><span class="n">j</span><span class="o">)</span> <span class="n">waterLevels</span><span class="o">[</span><span class="n">j</span><span class="o">]=</span> <span class="n">height</span><span class="o">[</span><span class="n">i</span><span class="o">];</span>
                <span class="o">}</span>
                <span class="n">walls</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="k">new</span> <span class="nc">Integer</span><span class="o">[]{</span><span class="n">height</span><span class="o">[</span><span class="n">i</span><span class="o">],</span> <span class="n">i</span><span class="o">});</span>
            <span class="o">}</span>
        <span class="o">}</span>

        <span class="c1">// sum up water volumes.</span>
        <span class="kt">int</span> <span class="n">ans</span><span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
        <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="n">ans</span> <span class="o">+=</span> <span class="nc">Math</span><span class="o">.</span><span class="na">max</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="n">waterLevels</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">-</span> <span class="n">height</span><span class="o">[</span><span class="n">i</span><span class="o">]);</span>
        <span class="k">return</span> <span class="n">ans</span><span class="o">;</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<h2 id="complexity">Complexity</h2>

<ul>
  <li>Time: \(O(n)\)</li>
  <li>Space: \(O(n)\)</li>
</ul>]]></content><author><name>Junha Jeong</name></author><category term="competitive-programming" /><category term="Stack" /><summary type="html"><![CDATA[Leetcode daily challenge 2022 september 18th solution]]></summary></entry><entry><title type="html">[Leetcode] 948. Bag of Tokens explained</title><link href="https://jooncco.github.io/competitive-programming/leetcode-948/" rel="alternate" type="text/html" title="[Leetcode] 948. Bag of Tokens explained" /><published>2022-09-12T00:00:00+00:00</published><updated>2022-09-12T13:39:08+00:00</updated><id>https://jooncco.github.io/competitive-programming/leetcode-948</id><content type="html" xml:base="https://jooncco.github.io/competitive-programming/leetcode-948/"><![CDATA[<h2 id="problem">Problem</h2>

<p><a href="https://leetcode.com/problems/bag-of-tokens/">948. Bag of Tokens</a></p>

<h2 id="approach">Approach</h2>

<p>Sort the <code class="language-plaintext highlighter-rouge">tokens</code> array in ascending order.<br />
Keep <code class="language-plaintext highlighter-rouge">left</code> and <code class="language-plaintext highlighter-rouge">right</code> indices, which denotes allowed tokens available with <code class="language-plaintext highlighter-rouge">initialPower</code>.</p>

<p><code class="language-plaintext highlighter-rouge">left</code> \(\leftarrow\) 0<br />
<code class="language-plaintext highlighter-rouge">right</code> \(\leftarrow\) n-1</p>

<p>While <code class="language-plaintext highlighter-rouge">left</code> &lt;= <code class="language-plaintext highlighter-rouge">right</code>:</p>

<ol>
  <li>Find maximum <code class="language-plaintext highlighter-rouge">score</code> we can make with tokens in <code class="language-plaintext highlighter-rouge">[left, right]</code> and update <code class="language-plaintext highlighter-rouge">maximumScore</code>.</li>
  <li>Subtract <code class="language-plaintext highlighter-rouge">tokens[l]</code> from <code class="language-plaintext highlighter-rouge">initialPower</code> and add <code class="language-plaintext highlighter-rouge">tokens[r]</code> to <code class="language-plaintext highlighter-rouge">initialPower</code>.</li>
  <li>Increment <code class="language-plaintext highlighter-rouge">left</code> by 1, and decrement <code class="language-plaintext highlighter-rouge">right</code> by 1.</li>
</ol>

<p>Return <code class="language-plaintext highlighter-rouge">maxScore</code> value in the end.</p>

<p>Sorting apparently takes \(O(n{\log}n)\).<br />
The indices <code class="language-plaintext highlighter-rouge">left</code> and <code class="language-plaintext highlighter-rouge">right</code> covers all n tokens, and each time there is a computation with n-complexity.<br />
Thie makes time complexity \(O(n^2)\).</p>

<h2 id="code">Code</h2>

<p><img src="/public/images/leetcode-948-result.png" /></p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Solution</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="kt">int</span> <span class="nf">bagOfTokensScore</span><span class="o">(</span><span class="kt">int</span><span class="o">[]</span> <span class="n">tokens</span><span class="o">,</span> <span class="kt">int</span> <span class="n">initialPower</span><span class="o">)</span> <span class="o">{</span>
        <span class="nc">Arrays</span><span class="o">.</span><span class="na">sort</span><span class="o">(</span><span class="n">tokens</span><span class="o">);</span>
        <span class="kt">int</span> <span class="n">n</span><span class="o">=</span> <span class="n">tokens</span><span class="o">.</span><span class="na">length</span><span class="o">,</span> <span class="n">l</span><span class="o">=</span> <span class="mi">0</span><span class="o">,</span> <span class="n">r</span><span class="o">=</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="o">;</span>
        <span class="kt">int</span> <span class="n">maxScore</span><span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
        <span class="k">while</span> <span class="o">(</span><span class="n">l</span> <span class="o">&lt;=</span> <span class="n">r</span><span class="o">)</span> <span class="o">{</span>
            <span class="k">if</span> <span class="o">(</span><span class="n">tokens</span><span class="o">[</span><span class="n">l</span><span class="o">]</span> <span class="o">&gt;</span> <span class="n">initialPower</span><span class="o">)</span> <span class="k">break</span><span class="o">;</span>
            <span class="kt">int</span> <span class="n">idx</span><span class="o">=</span> <span class="n">l</span><span class="o">,</span> <span class="n">score</span><span class="o">=</span> <span class="mi">0</span><span class="o">,</span> <span class="n">power</span><span class="o">=</span> <span class="n">initialPower</span><span class="o">;</span>
            <span class="k">while</span> <span class="o">(</span><span class="n">idx</span> <span class="o">&lt;=</span> <span class="n">r</span> <span class="o">&amp;&amp;</span> <span class="n">tokens</span><span class="o">[</span><span class="n">idx</span><span class="o">]</span> <span class="o">&lt;=</span> <span class="n">power</span><span class="o">)</span> <span class="o">{</span>
                <span class="n">power</span> <span class="o">-=</span> <span class="n">tokens</span><span class="o">[</span><span class="n">idx</span><span class="o">++];</span>
                <span class="o">++</span><span class="n">score</span><span class="o">;</span>
            <span class="o">}</span>
            <span class="n">maxScore</span><span class="o">=</span> <span class="nc">Math</span><span class="o">.</span><span class="na">max</span><span class="o">(</span><span class="n">maxScore</span><span class="o">,</span> <span class="n">score</span><span class="o">);</span>

            <span class="n">initialPower</span> <span class="o">+=</span> <span class="o">(</span><span class="n">tokens</span><span class="o">[</span><span class="n">r</span><span class="o">]-</span><span class="n">tokens</span><span class="o">[</span><span class="n">l</span><span class="o">]);</span>
            <span class="o">++</span><span class="n">l</span><span class="o">;</span> <span class="o">--</span><span class="n">r</span><span class="o">;</span>
        <span class="o">}</span>
        <span class="k">return</span> <span class="n">maxScore</span><span class="o">;</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<h2 id="complexity">Complexity</h2>

<ul>
  <li>Time: \(O(n{\log}n + n^2)\)</li>
  <li>Space: \(O(1)\)</li>
</ul>]]></content><author><name>Junha Jeong</name></author><category term="competitive-programming" /><category term="Sortings" /><category term="Two pointers" /><summary type="html"><![CDATA[Leetcode daily challenge 2022 september 12th solution]]></summary></entry><entry><title type="html">[Leetcode] 188. Best Time to Buy and Sell Stock IV explained</title><link href="https://jooncco.github.io/competitive-programming/leetcode-188/" rel="alternate" type="text/html" title="[Leetcode] 188. Best Time to Buy and Sell Stock IV explained" /><published>2022-09-11T00:00:00+00:00</published><updated>2022-09-10T16:24:08+00:00</updated><id>https://jooncco.github.io/competitive-programming/leetcode-188</id><content type="html" xml:base="https://jooncco.github.io/competitive-programming/leetcode-188/"><![CDATA[<h2 id="problem">Problem</h2>

<p><a href="https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/">188. Best Time to Buy and Sell Stock IV</a></p>

<h2 id="approach">Approach</h2>

<p>This is a typical dynamic programming problem.</p>

<p>Before we get into main point, suppose we have unlimited chance of transaction (<code class="language-plaintext highlighter-rouge">k</code> \(= \infty\). <code class="language-plaintext highlighter-rouge">k</code> \(= \frac{k}{2}\) is large enough).<br />
Then, we may perform transaction whenever we discover price higher than yesterday, and that becomes our maximum profit.<br />
Please note the <code class="language-plaintext highlighter-rouge">quickSolve</code> method in solution.</p>

<p>Now let’s get into our main discussion.</p>

<p>We define a recursive helper function <code class="language-plaintext highlighter-rouge">findMaxProfit</code>, which finds maximum profit with <code class="language-plaintext highlighter-rouge">k</code> transactions in interval <code class="language-plaintext highlighter-rouge">[0, endIdx]</code>, inclusive.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">private</span> <span class="kt">int</span> <span class="nf">findMaxProfit</span><span class="o">(</span><span class="kd">final</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">prices</span><span class="o">,</span> <span class="kt">int</span> <span class="n">endIdx</span><span class="o">,</span> <span class="kt">int</span> <span class="n">k</span><span class="o">)</span> <span class="o">{</span>
    <span class="k">if</span> <span class="o">(</span><span class="n">endIdx</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="o">||</span> <span class="n">k</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="k">return</span> <span class="mi">0</span><span class="o">;</span>

    <span class="kt">int</span> <span class="n">maxProfit</span><span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
    <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">endIdx</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">prices</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">&lt;</span> <span class="n">prices</span><span class="o">[</span><span class="n">endIdx</span><span class="o">])</span> <span class="o">{</span>
            <span class="kt">int</span> <span class="n">spotProfit</span><span class="o">=</span> <span class="n">prices</span><span class="o">[</span><span class="n">endIdx</span><span class="o">]</span> <span class="o">-</span> <span class="n">prices</span><span class="o">[</span><span class="n">i</span><span class="o">];</span>
            <span class="n">maxProfit</span><span class="o">=</span> <span class="nc">Math</span><span class="o">.</span><span class="na">max</span><span class="o">(</span><span class="n">maxProfit</span><span class="o">,</span> <span class="n">findMaxProfit</span><span class="o">(</span><span class="n">prices</span><span class="o">,</span> <span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="o">,</span> <span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="o">)</span> <span class="o">+</span> <span class="n">spotProfit</span><span class="o">);</span>
        <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
            <span class="n">maxProfit</span><span class="o">=</span> <span class="nc">Math</span><span class="o">.</span><span class="na">max</span><span class="o">(</span><span class="n">maxProfit</span><span class="o">,</span> <span class="n">findMaxProfit</span><span class="o">(</span><span class="n">prices</span><span class="o">,</span> <span class="n">i</span><span class="o">,</span> <span class="n">k</span><span class="o">));</span>
        <span class="o">}</span>
    <span class="o">}</span>
    <span class="k">return</span> <span class="n">maxProfit</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>

<p>But that’s not good enough.<br />
We compute <code class="language-plaintext highlighter-rouge">maxProfit</code> value over and over, which is known as overlapping subproblems in dp.</p>

<p>Below is the optimal version of <code class="language-plaintext highlighter-rouge">findMaxProfit</code>, using <code class="language-plaintext highlighter-rouge">memoization</code>.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">private</span> <span class="kt">int</span> <span class="nf">findMaxProfit</span><span class="o">(</span><span class="kd">final</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">prices</span><span class="o">,</span> <span class="kt">int</span> <span class="n">endIdx</span><span class="o">,</span> <span class="kt">int</span> <span class="n">k</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">endIdx</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="o">||</span> <span class="n">k</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="k">return</span> <span class="mi">0</span><span class="o">;</span>

        <span class="k">if</span> <span class="o">(</span><span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">]</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="o">)</span> <span class="k">return</span> <span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">];</span>
        <span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">]=</span> <span class="mi">0</span><span class="o">;</span>
        <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">endIdx</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
            <span class="k">if</span> <span class="o">(</span><span class="n">prices</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">&lt;</span> <span class="n">prices</span><span class="o">[</span><span class="n">endIdx</span><span class="o">])</span> <span class="o">{</span>
                <span class="kt">int</span> <span class="n">spotProfit</span><span class="o">=</span> <span class="n">prices</span><span class="o">[</span><span class="n">endIdx</span><span class="o">]</span> <span class="o">-</span> <span class="n">prices</span><span class="o">[</span><span class="n">i</span><span class="o">];</span>
                <span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">]=</span> <span class="nc">Math</span><span class="o">.</span><span class="na">max</span><span class="o">(</span><span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">],</span> <span class="n">findMaxProfit</span><span class="o">(</span><span class="n">prices</span><span class="o">,</span> <span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="o">,</span> <span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="o">)</span> <span class="o">+</span> <span class="n">spotProfit</span><span class="o">);</span>
            <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
                <span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">]=</span> <span class="nc">Math</span><span class="o">.</span><span class="na">max</span><span class="o">(</span><span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">],</span> <span class="n">findMaxProfit</span><span class="o">(</span><span class="n">prices</span><span class="o">,</span> <span class="n">i</span><span class="o">,</span> <span class="n">k</span><span class="o">));</span>
            <span class="o">}</span>
        <span class="o">}</span>
        <span class="k">return</span> <span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">];</span>
    <span class="o">}</span>
</code></pre></div></div>

<p>We now can simply return <code class="language-plaintext highlighter-rouge">findMaxProfit(prices, n-1, k)</code>.</p>

<h2 id="code">Code</h2>

<p><img src="/public/images/leetcode-188-result.png" /></p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/**
 * author: jooncco
 * written: 2022. 9. 11. Tue. 02:04:14 [UTC+9]
 **/</span>

<span class="kd">class</span> <span class="nc">Solution</span> <span class="o">{</span>
    <span class="kd">private</span> <span class="kt">int</span> <span class="n">n</span><span class="o">;</span>
    <span class="kd">private</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">cache</span><span class="o">;</span>

    <span class="kd">public</span> <span class="kt">int</span> <span class="nf">maxProfit</span><span class="o">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">,</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">prices</span><span class="o">)</span> <span class="o">{</span>
        <span class="n">n</span><span class="o">=</span> <span class="n">prices</span><span class="o">.</span><span class="na">length</span><span class="o">;</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">k</span> <span class="o">&gt;=</span> <span class="n">n</span><span class="o">/</span><span class="mi">2</span><span class="o">)</span> <span class="k">return</span> <span class="n">quickSolve</span><span class="o">(</span><span class="n">prices</span><span class="o">,</span> <span class="n">k</span><span class="o">);</span>

        <span class="n">cache</span><span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="o">][</span><span class="n">k</span><span class="o">+</span><span class="mi">1</span><span class="o">];</span>
        <span class="k">for</span> <span class="o">(</span><span class="kt">int</span><span class="o">[]</span> <span class="n">row</span> <span class="o">:</span> <span class="n">cache</span><span class="o">)</span> <span class="nc">Arrays</span><span class="o">.</span><span class="na">fill</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="o">-</span><span class="mi">1</span><span class="o">);</span>
        <span class="k">return</span> <span class="nf">findMaxProfit</span><span class="o">(</span><span class="n">prices</span><span class="o">,</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="o">,</span> <span class="n">k</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="kd">private</span> <span class="kt">int</span> <span class="nf">findMaxProfit</span><span class="o">(</span><span class="kd">final</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">prices</span><span class="o">,</span> <span class="kt">int</span> <span class="n">endIdx</span><span class="o">,</span> <span class="kt">int</span> <span class="n">k</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">endIdx</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="o">||</span> <span class="n">k</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="k">return</span> <span class="mi">0</span><span class="o">;</span>

        <span class="k">if</span> <span class="o">(</span><span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">]</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="o">)</span> <span class="k">return</span> <span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">];</span>
        <span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">]=</span> <span class="mi">0</span><span class="o">;</span>
        <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">endIdx</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
            <span class="k">if</span> <span class="o">(</span><span class="n">prices</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">&lt;</span> <span class="n">prices</span><span class="o">[</span><span class="n">endIdx</span><span class="o">])</span> <span class="o">{</span>
                <span class="kt">int</span> <span class="n">spotProfit</span><span class="o">=</span> <span class="n">prices</span><span class="o">[</span><span class="n">endIdx</span><span class="o">]</span> <span class="o">-</span> <span class="n">prices</span><span class="o">[</span><span class="n">i</span><span class="o">];</span>
                <span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">]=</span> <span class="nc">Math</span><span class="o">.</span><span class="na">max</span><span class="o">(</span><span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">],</span> <span class="n">findMaxProfit</span><span class="o">(</span><span class="n">prices</span><span class="o">,</span> <span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="o">,</span> <span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="o">)</span> <span class="o">+</span> <span class="n">spotProfit</span><span class="o">);</span>
            <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
                <span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">]=</span> <span class="nc">Math</span><span class="o">.</span><span class="na">max</span><span class="o">(</span><span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">],</span> <span class="n">findMaxProfit</span><span class="o">(</span><span class="n">prices</span><span class="o">,</span> <span class="n">i</span><span class="o">,</span> <span class="n">k</span><span class="o">));</span>
            <span class="o">}</span>
        <span class="o">}</span>
        <span class="k">return</span> <span class="n">cache</span><span class="o">[</span><span class="n">endIdx</span><span class="o">][</span><span class="n">k</span><span class="o">];</span>
    <span class="o">}</span>

    <span class="kd">private</span> <span class="kt">int</span> <span class="nf">quickSolve</span><span class="o">(</span><span class="kd">final</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">prices</span><span class="o">,</span> <span class="kt">int</span> <span class="n">k</span><span class="o">)</span> <span class="o">{</span>
        <span class="kt">int</span> <span class="n">maxProfit</span><span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
        <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
            <span class="k">if</span> <span class="o">(</span><span class="n">prices</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">&gt;</span> <span class="n">prices</span><span class="o">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="o">])</span> <span class="n">maxProfit</span> <span class="o">+=</span> <span class="n">prices</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">-</span> <span class="n">prices</span><span class="o">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="o">];</span>
        <span class="o">}</span>
        <span class="k">return</span> <span class="n">maxProfit</span><span class="o">;</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<h2 id="complexity">Complexity</h2>

<ul>
  <li>Time: \(O(n^2)\)</li>
  <li>Space: \(O(n{\cdot}k)\)</li>
</ul>]]></content><author><name>Junha Jeong</name></author><category term="competitive-programming" /><category term="Dynamic programming" /><summary type="html"><![CDATA[Leetcode daily challenge 2022 september 11th solution]]></summary></entry><entry><title type="html">[Leetcode] 94. Binary Tree Inorder Traversal explained</title><link href="https://jooncco.github.io/competitive-programming/leetcode-94/" rel="alternate" type="text/html" title="[Leetcode] 94. Binary Tree Inorder Traversal explained" /><published>2022-09-08T00:00:00+00:00</published><updated>2022-09-08T02:07:08+00:00</updated><id>https://jooncco.github.io/competitive-programming/leetcode-94</id><content type="html" xml:base="https://jooncco.github.io/competitive-programming/leetcode-94/"><![CDATA[<h2 id="problem">Problem</h2>

<p><a href="&quot;https://leetcode.com/problems/binary-tree-inorder-traversal/">94. Binary Tree Inorder Traversal</a></p>

<h2 id="approach">Approach</h2>

<p>Recursive approach is trivial.<br />
We can implement inorder traversal using <code class="language-plaintext highlighter-rouge">Stack</code>.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">curNode</span> <span class="o">&lt;-</span> <span class="n">root</span>
<span class="k">while</span> <span class="n">true</span><span class="p">:</span>
    <span class="k">if</span> <span class="n">curNode</span> <span class="ow">is</span> <span class="n">null</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">stack</span> <span class="ow">is</span> <span class="n">empty</span><span class="p">:</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="n">tmpNode</span> <span class="o">&lt;-</span> <span class="n">stack</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
        <span class="n">add</span> <span class="n">tmpNode</span><span class="p">.</span><span class="n">val</span> <span class="n">to</span> <span class="n">result</span>
        <span class="n">curNode</span> <span class="o">&lt;-</span> <span class="n">tmpNode</span><span class="p">.</span><span class="n">right</span><span class="p">;</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">curNode</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">null</span><span class="p">:</span>
            <span class="n">push</span> <span class="n">curNode</span> <span class="n">into</span> <span class="n">stack</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">curNode</span> <span class="o">&lt;-</span> <span class="n">curNode</span><span class="p">.</span><span class="n">left</span><span class="p">;</span>
</code></pre></div></div>

<h2 id="code">Code</h2>

<p><img src="/public/images/leetcode-94-result.png" /></p>

<h3 id="recursive-approach">Recursive approach</h3>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/**
 * author: jooncco
 * written: 2022. 9. 8. Tue. 11:34:14 [UTC+9]
 **/</span>

<span class="kd">class</span> <span class="nc">Solution</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="nc">List</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="nf">inorderTraversal</span><span class="o">(</span><span class="nc">TreeNode</span> <span class="n">root</span><span class="o">)</span> <span class="o">{</span>
        <span class="nc">List</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">result</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">LinkedList</span><span class="o">&lt;&gt;();</span>
        <span class="n">inorder</span><span class="o">(</span><span class="n">result</span><span class="o">,</span> <span class="n">root</span><span class="o">);</span>
        <span class="k">return</span> <span class="n">result</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">private</span> <span class="kt">void</span> <span class="nf">inorder</span><span class="o">(</span><span class="nc">List</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">arr</span><span class="o">,</span> <span class="nc">TreeNode</span> <span class="n">node</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">node</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="k">return</span><span class="o">;</span>

        <span class="n">inorder</span><span class="o">(</span><span class="n">arr</span><span class="o">,</span> <span class="n">node</span><span class="o">.</span><span class="na">left</span><span class="o">);</span>
        <span class="n">arr</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">node</span><span class="o">.</span><span class="na">val</span><span class="o">);</span>
        <span class="n">inorder</span><span class="o">(</span><span class="n">arr</span><span class="o">,</span> <span class="n">node</span><span class="o">.</span><span class="na">right</span><span class="o">);</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<h3 id="iterative-approach">Iterative approach</h3>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/**
 * author: jooncco
 * written: 2022. 9. 8. Tue. 13:36:14 [UTC+9]
 **/</span>

<span class="kd">class</span> <span class="nc">Solution</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="nc">List</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="nf">inorderTraversal</span><span class="o">(</span><span class="nc">TreeNode</span> <span class="n">root</span><span class="o">)</span> <span class="o">{</span>
        <span class="nc">Stack</span><span class="o">&lt;</span><span class="nc">TreeNode</span><span class="o">&gt;</span> <span class="n">stack</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Stack</span><span class="o">&lt;&gt;();</span>
        <span class="nc">List</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">result</span><span class="o">=</span> <span class="k">new</span> <span class="nc">LinkedList</span><span class="o">&lt;&gt;();</span>

        <span class="nc">TreeNode</span> <span class="n">curNode</span> <span class="o">=</span> <span class="n">root</span><span class="o">;</span>
        <span class="k">while</span> <span class="o">(</span><span class="kc">true</span><span class="o">)</span> <span class="o">{</span>
            <span class="k">if</span> <span class="o">(</span><span class="n">curNode</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
                <span class="k">if</span> <span class="o">(</span><span class="n">stack</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">())</span> <span class="k">break</span><span class="o">;</span>
                <span class="n">result</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">stack</span><span class="o">.</span><span class="na">peek</span><span class="o">().</span><span class="na">val</span><span class="o">);</span>
                <span class="n">curNode</span><span class="o">=</span> <span class="n">stack</span><span class="o">.</span><span class="na">pop</span><span class="o">().</span><span class="na">right</span><span class="o">;</span>
            <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
                <span class="k">if</span> <span class="o">(</span><span class="n">curNode</span><span class="o">.</span><span class="na">left</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
                    <span class="n">stack</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="n">curNode</span><span class="o">);</span>
                    <span class="n">curNode</span><span class="o">=</span> <span class="n">curNode</span><span class="o">.</span><span class="na">left</span><span class="o">;</span>
                <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
                    <span class="n">result</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">curNode</span><span class="o">.</span><span class="na">val</span><span class="o">);</span>
                    <span class="n">curNode</span><span class="o">=</span> <span class="n">curNode</span><span class="o">.</span><span class="na">right</span><span class="o">;</span>
                <span class="o">}</span>
            <span class="o">}</span>
        <span class="o">}</span>
        <span class="k">return</span> <span class="n">result</span><span class="o">;</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<h2 id="complexity">Complexity</h2>

<ul>
  <li>Time: \(O(n)\)</li>
  <li>Space: \(O(n)\)</li>
</ul>]]></content><author><name>Junha Jeong</name></author><category term="competitive-programming" /><category term="Trees" /><summary type="html"><![CDATA[Leetcode daily challenge 2022 september 8th solution]]></summary></entry><entry><title type="html">[Codeforces] 1490C. Sum of Cubes explained</title><link href="https://jooncco.github.io/competitive-programming/codeforces-1490C/" rel="alternate" type="text/html" title="[Codeforces] 1490C. Sum of Cubes explained" /><published>2022-09-06T00:00:00+00:00</published><updated>2022-09-04T15:11:14+00:00</updated><id>https://jooncco.github.io/competitive-programming/codeforces-1490C</id><content type="html" xml:base="https://jooncco.github.io/competitive-programming/codeforces-1490C/"><![CDATA[<h2 id="problem">Problem</h2>

<p><a href="http://codeforces.com/contest/1490/problem/C">1490C. Sum of Cubes</a></p>

<h2 id="approach">Approach</h2>

<p>Transpose \(a^3\).<br />
It becomes finding value <code class="language-plaintext highlighter-rouge">b</code> which is \(b = \sqrt[3]{x-a^3}\).<br />
And it can be solved with <code class="language-plaintext highlighter-rouge">brute force</code>.<br />
Took some time for me to find a way to tell wether b is integer or not.</p>

<h2 id="code">Code</h2>

<p><img src="/public/images/codeforces-1490C-result.png" /></p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/**
 * author: jooncco
 * written: 2022. 9. 6. Tue. 00:05:14 [UTC+9]
 **/</span>

<span class="kn">import</span> <span class="nn">java.io.BufferedReader</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.io.IOException</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.io.InputStreamReader</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.HashSet</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.Set</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.StringTokenizer</span><span class="o">;</span>

<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span>
    <span class="kd">private</span> <span class="kd">final</span> <span class="kd">static</span> <span class="nc">FastScanner</span> <span class="n">sc</span><span class="o">=</span> <span class="k">new</span> <span class="nc">FastScanner</span><span class="o">();</span>
    <span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="nc">Long</span> <span class="n">mx</span><span class="o">=</span> <span class="mi">1000000000000L</span><span class="o">;</span>

    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
        <span class="nc">Set</span><span class="o">&lt;</span><span class="nc">Long</span><span class="o">&gt;</span> <span class="n">cubes</span><span class="o">=</span> <span class="k">new</span> <span class="nc">HashSet</span><span class="o">&lt;&gt;();</span>
        <span class="n">preCalc</span><span class="o">(</span><span class="n">cubes</span><span class="o">);</span>

        <span class="kt">long</span> <span class="n">t</span><span class="o">,</span><span class="n">x</span><span class="o">;</span> <span class="n">t</span><span class="o">=</span> <span class="n">sc</span><span class="o">.</span><span class="na">nextLong</span><span class="o">();</span>
        <span class="k">while</span> <span class="o">(</span><span class="n">t</span><span class="o">--</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
            <span class="n">x</span><span class="o">=</span> <span class="n">sc</span><span class="o">.</span><span class="na">nextLong</span><span class="o">();</span>
            <span class="kt">boolean</span> <span class="n">yes</span><span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
            <span class="k">for</span> <span class="o">(</span><span class="kt">long</span> <span class="n">a</span><span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">a</span><span class="o">*</span><span class="n">a</span><span class="o">*</span><span class="n">a</span> <span class="o">&lt;=</span> <span class="n">x</span><span class="o">;</span> <span class="o">++</span><span class="n">a</span><span class="o">)</span> <span class="o">{</span>
                <span class="k">if</span> <span class="o">(</span><span class="n">cubes</span><span class="o">.</span><span class="na">contains</span><span class="o">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">a</span><span class="o">*</span><span class="n">a</span><span class="o">*</span><span class="n">a</span><span class="o">))</span> <span class="o">{</span>
                    <span class="n">yes</span><span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
                    <span class="k">break</span><span class="o">;</span>
                <span class="o">}</span>
            <span class="o">}</span>
            <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">yes</span> <span class="o">?</span> <span class="s">"YES"</span><span class="o">:</span><span class="s">"NO"</span><span class="o">);</span>
        <span class="o">}</span>
    <span class="o">}</span>

    <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">preCalc</span><span class="o">(</span><span class="nc">Set</span><span class="o">&lt;</span><span class="nc">Long</span><span class="o">&gt;</span> <span class="n">cubes</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">for</span> <span class="o">(</span><span class="kt">long</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="o">;</span> <span class="n">i</span><span class="o">*</span><span class="n">i</span><span class="o">*</span><span class="n">i</span> <span class="o">&lt;=</span> <span class="n">mx</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
            <span class="n">cubes</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">i</span><span class="o">*</span><span class="n">i</span><span class="o">*</span><span class="n">i</span><span class="o">);</span>
        <span class="o">}</span>
    <span class="o">}</span>

<span class="o">}</span>

<span class="kd">class</span> <span class="nc">FastScanner</span> <span class="o">{</span>
    <span class="nc">BufferedReader</span> <span class="n">br</span><span class="o">=</span><span class="k">new</span> <span class="nc">BufferedReader</span><span class="o">(</span><span class="k">new</span> <span class="nc">InputStreamReader</span><span class="o">(</span><span class="nc">System</span><span class="o">.</span><span class="na">in</span><span class="o">));</span>
    <span class="nc">StringTokenizer</span> <span class="n">st</span><span class="o">=</span><span class="k">new</span> <span class="nc">StringTokenizer</span><span class="o">(</span><span class="s">""</span><span class="o">);</span>
    <span class="nc">String</span> <span class="nf">next</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">while</span> <span class="o">(!</span><span class="n">st</span><span class="o">.</span><span class="na">hasMoreTokens</span><span class="o">())</span> <span class="o">{</span>
            <span class="k">try</span> <span class="o">{</span>
                <span class="n">st</span><span class="o">=</span><span class="k">new</span> <span class="nc">StringTokenizer</span><span class="o">(</span><span class="n">br</span><span class="o">.</span><span class="na">readLine</span><span class="o">());</span>
            <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">IOException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{}</span>
        <span class="o">}</span>
        <span class="k">return</span> <span class="n">st</span><span class="o">.</span><span class="na">nextToken</span><span class="o">();</span>
    <span class="o">}</span>

    <span class="kt">int</span> <span class="nf">nextInt</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">next</span><span class="o">());</span>
    <span class="o">}</span>
    <span class="kt">long</span> <span class="nf">nextLong</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="nc">Long</span><span class="o">.</span><span class="na">parseLong</span><span class="o">(</span><span class="n">next</span><span class="o">());</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<h2 id="complexity">Complexity</h2>

<ul>
  <li>Time: \(O(\sqrt[3]x)\)</li>
  <li>Space: \(O(1)\)</li>
</ul>]]></content><author><name>Junha Jeong</name></author><category term="competitive-programming" /><category term="Math" /><category term="Brute force" /><summary type="html"><![CDATA[Codeforces Round #702(Div.3) - problem C solution]]></summary></entry><entry><title type="html">[Leetcode] 814. Binary Tree Pruning explained</title><link href="https://jooncco.github.io/competitive-programming/leetcode-814/" rel="alternate" type="text/html" title="[Leetcode] 814. Binary Tree Pruning explained" /><published>2022-09-06T00:00:00+00:00</published><updated>2022-09-06T04:11:08+00:00</updated><id>https://jooncco.github.io/competitive-programming/leetcode-814</id><content type="html" xml:base="https://jooncco.github.io/competitive-programming/leetcode-814/"><![CDATA[<h2 id="problem">Problem</h2>

<p><a href="https://leetcode.com/problems/binary-tree-pruning/">814. Binary Tree Pruning</a></p>

<h2 id="approach">Approach</h2>

<p>For each tree node, repeat below process.</p>

<ol>
  <li>Prune left child.</li>
  <li>Prune right child.</li>
  <li>If left and right child is <code class="language-plaintext highlighter-rouge">null</code> and this node doesn’t have value <code class="language-plaintext highlighter-rouge">1</code>, return <code class="language-plaintext highlighter-rouge">null</code> (prunning).</li>
</ol>

<h2 id="code">Code</h2>

<p><img src="/public/images/leetcode-814-result.png" /></p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/**
 * author: jooncco
 * written: 2022. 9. 6. Tue. 13:14:14 [UTC+9]
 **/</span>

<span class="kd">class</span> <span class="nc">Solution</span> <span class="o">{</span>
    <span class="kd">private</span> <span class="kd">final</span> <span class="kt">int</span> <span class="no">TARGET_VALUE</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span>

    <span class="kd">public</span> <span class="nc">TreeNode</span> <span class="nf">pruneTree</span><span class="o">(</span><span class="nc">TreeNode</span> <span class="n">root</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">root</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>

        <span class="n">root</span><span class="o">.</span><span class="na">left</span><span class="o">=</span> <span class="n">pruneTree</span><span class="o">(</span><span class="n">root</span><span class="o">.</span><span class="na">left</span><span class="o">);</span>
        <span class="n">root</span><span class="o">.</span><span class="na">right</span><span class="o">=</span> <span class="n">pruneTree</span><span class="o">(</span><span class="n">root</span><span class="o">.</span><span class="na">right</span><span class="o">);</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">root</span><span class="o">.</span><span class="na">left</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">&amp;&amp;</span> <span class="n">root</span><span class="o">.</span><span class="na">right</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">&amp;&amp;</span> <span class="n">root</span><span class="o">.</span><span class="na">val</span> <span class="o">!=</span> <span class="no">TARGET_VALUE</span><span class="o">)</span> <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
        <span class="k">return</span> <span class="n">root</span><span class="o">;</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<h2 id="complexity">Complexity</h2>

<ul>
  <li>Time: \(O(n)\)</li>
  <li>Space: \(O(n)\)</li>
</ul>]]></content><author><name>Junha Jeong</name></author><category term="competitive-programming" /><category term="Trees" /><summary type="html"><![CDATA[Leetcode daily challenge 2022 september 6th solution]]></summary></entry><entry><title type="html">[LeetCode] 2212. Maximum Points in an Archery Competition explained</title><link href="https://jooncco.github.io/competitive-programming/leetcode-2212/" rel="alternate" type="text/html" title="[LeetCode] 2212. Maximum Points in an Archery Competition explained" /><published>2022-03-20T00:00:00+00:00</published><updated>2022-03-20T07:34:00+00:00</updated><id>https://jooncco.github.io/competitive-programming/leetcode-2212</id><content type="html" xml:base="https://jooncco.github.io/competitive-programming/leetcode-2212/"><![CDATA[<h2 id="problem">Problem</h2>

<p><a href="https://leetcode.com/problems/maximum-points-in-an-archery-competition/&quot;">2212. Maximum Points in an Archery Competition</a></p>

<h2 id="approach">Approach</h2>

<p>Note that we have fairly short range of points <code class="language-plaintext highlighter-rouge">{ 0, 1, ... 11 }</code>.<br />
Total number of subsets is \(2^{12} = 4096\), and each of them can be Bob’s choice as long as he has enough arrows.</p>

<p>Brute force all the cases using <code class="language-plaintext highlighter-rouge">bitmask</code>, and find the maximum total point of Bob’s satisfying certain condition:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">maxPoint</span><span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">maxMask</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">mask</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">mask</span> <span class="o">&lt;</span> <span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="mi">12</span><span class="p">);</span> <span class="o">++</span><span class="n">mask</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">totalPoint</span><span class="p">(</span><span class="n">mask</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">maxPoint</span> <span class="o">&amp;&amp;</span>
        <span class="n">arrowsNeeded</span><span class="p">(</span><span class="n">mask</span><span class="p">,</span> <span class="n">aliceArrows</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="n">numArrows</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">maxPoint</span><span class="o">=</span> <span class="n">totalPoint</span><span class="p">(</span><span class="n">mask</span><span class="p">);</span>
        <span class="n">maxMask</span><span class="o">=</span> <span class="n">mask</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Helper functions:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">private:</span>
    <span class="kt">int</span> <span class="nf">totalPoint</span><span class="p">(</span><span class="kt">int</span> <span class="n">mask</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">point</span><span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">12</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">mask</span> <span class="o">&amp;</span> <span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">i</span><span class="p">))</span> <span class="n">point</span> <span class="o">+=</span> <span class="n">i</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">point</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kt">int</span> <span class="n">arrowsNeeded</span><span class="p">(</span><span class="kt">int</span> <span class="n">mask</span><span class="p">,</span> <span class="n">vi</span> <span class="o">&amp;</span><span class="n">aliceArrows</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">arrows</span><span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">12</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">mask</span> <span class="o">&amp;</span> <span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">i</span><span class="p">))</span> <span class="p">{</span>
                <span class="n">arrows</span> <span class="o">+=</span> <span class="n">aliceArrows</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">arrows</span><span class="p">;</span>
    <span class="p">}</span>
</code></pre></div></div>

<p>Now that you have the <code class="language-plaintext highlighter-rouge">maxMask</code>, construct the answer array:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">vi</span> <span class="nf">ret</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
<span class="kt">int</span> <span class="n">cnt</span><span class="o">=</span> <span class="n">numArrows</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">12</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">maxMask</span> <span class="o">&amp;</span> <span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">i</span><span class="p">))</span> <span class="p">{</span>
        <span class="n">ret</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">=</span> <span class="n">aliceArrows</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
        <span class="n">cnt</span> <span class="o">-=</span> <span class="n">ret</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
    <span class="p">}</span>
<span class="p">}</span>
<span class="n">ret</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span> <span class="n">cnt</span><span class="p">;</span>
</code></pre></div></div>

<h2 id="code">Code</h2>

<p><img src="/public/images/leetcode-2212-result.png" /></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">typedef</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">vi</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
<span class="nl">private:</span>
    <span class="kt">int</span> <span class="n">totalPoint</span><span class="p">(</span><span class="kt">int</span> <span class="n">mask</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">point</span><span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">12</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">mask</span> <span class="o">&amp;</span> <span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">i</span><span class="p">))</span> <span class="n">point</span> <span class="o">+=</span> <span class="n">i</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">point</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kt">int</span> <span class="n">arrowsNeeded</span><span class="p">(</span><span class="kt">int</span> <span class="n">mask</span><span class="p">,</span> <span class="n">vi</span> <span class="o">&amp;</span><span class="n">aliceArrows</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">arrows</span><span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">12</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">mask</span> <span class="o">&amp;</span> <span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">i</span><span class="p">))</span> <span class="p">{</span>
                <span class="n">arrows</span> <span class="o">+=</span> <span class="n">aliceArrows</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">arrows</span><span class="p">;</span>
    <span class="p">}</span>

<span class="nl">public:</span>
    <span class="n">vi</span> <span class="n">maximumBobPoints</span><span class="p">(</span><span class="kt">int</span> <span class="n">numArrows</span><span class="p">,</span> <span class="n">vi</span> <span class="o">&amp;</span><span class="n">aliceArrows</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">maxPoint</span><span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">maxMask</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">mask</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">mask</span> <span class="o">&lt;</span> <span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="mi">12</span><span class="p">);</span> <span class="o">++</span><span class="n">mask</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">totalPoint</span><span class="p">(</span><span class="n">mask</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">maxPoint</span> <span class="o">&amp;&amp;</span>
                <span class="n">arrowsNeeded</span><span class="p">(</span><span class="n">mask</span><span class="p">,</span> <span class="n">aliceArrows</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="n">numArrows</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">maxPoint</span><span class="o">=</span> <span class="n">totalPoint</span><span class="p">(</span><span class="n">mask</span><span class="p">);</span>
                <span class="n">maxMask</span><span class="o">=</span> <span class="n">mask</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="n">vi</span> <span class="n">ret</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
        <span class="kt">int</span> <span class="n">cnt</span><span class="o">=</span> <span class="n">numArrows</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">12</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">maxMask</span> <span class="o">&amp;</span> <span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">i</span><span class="p">))</span> <span class="p">{</span>
                <span class="n">ret</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">=</span> <span class="n">aliceArrows</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
                <span class="n">cnt</span> <span class="o">-=</span> <span class="n">ret</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="n">ret</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span> <span class="n">cnt</span><span class="p">;</span>
        <span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<h2 id="complexity">Complexity</h2>

<ul>
  <li>Time: \(O(1)\)</li>
  <li>Space: \(O(1)\)</li>
</ul>]]></content><author><name>Junha Jeong</name></author><category term="competitive-programming" /><category term="Bitmask" /><category term="Brute force" /><summary type="html"><![CDATA[Leetcode Weekly 285 - Q3]]></summary></entry><entry><title type="html">[LeetCode] 2203. Minimum Weighted Subgraph With the Required Paths explained</title><link href="https://jooncco.github.io/competitive-programming/leetcode-2203/" rel="alternate" type="text/html" title="[LeetCode] 2203. Minimum Weighted Subgraph With the Required Paths explained" /><published>2022-03-14T00:00:00+00:00</published><updated>2022-03-20T10:10:00+00:00</updated><id>https://jooncco.github.io/competitive-programming/leetcode-2203</id><content type="html" xml:base="https://jooncco.github.io/competitive-programming/leetcode-2203/"><![CDATA[<h2 id="problem">Problem</h2>

<p><a href="https://leetcode.com/problems/minimum-weighted-subgraph-with-the-required-paths/">2203. Minimum Weighted Subgraph With the Required Paths</a></p>

<h2 id="approach">Approach</h2>

<p>The <strong>shortest path</strong> of target subgraph falls into 3 forms:</p>

<ol>
  <li>
    <p><code class="language-plaintext highlighter-rouge">src1</code> -&gt; <code class="language-plaintext highlighter-rouge">src2</code> -&gt; <code class="language-plaintext highlighter-rouge">dest</code><br />
<img src="/public/images/leetcode-2203-figure-1.png" title="figure-1" /></p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">src2</code> -&gt; <code class="language-plaintext highlighter-rouge">src1</code> -&gt; <code class="language-plaintext highlighter-rouge">dest</code><br />
<img src="/public/images/leetcode-2203-figure-2.png" title="figure-2" /></p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">src1</code> -&gt; <code class="language-plaintext highlighter-rouge">dest</code>, <code class="language-plaintext highlighter-rouge">src2</code> -&gt; <code class="language-plaintext highlighter-rouge">dest</code> (without sharing edges)<br />
<img src="/public/images/leetcode-2203-figure-3.png" title="figure-3" /></p>
  </li>
</ol>

<p>In every case, there always exists a vertex which two routes first join.<br />
So we can generalize the process of finding shortest path as following:</p>

<p><img src="/public/images/leetcode-2203-figure-4.png" title="figure-4" /></p>

<ol>
  <li>Find the shortest path from <code class="language-plaintext highlighter-rouge">src1</code>-&gt;<code class="language-plaintext highlighter-rouge">pivot</code></li>
  <li>Find the shortest path from <code class="language-plaintext highlighter-rouge">src2</code>-&gt;<code class="language-plaintext highlighter-rouge">pivot</code></li>
  <li>Find the shortest path from <code class="language-plaintext highlighter-rouge">pivot</code>-&gt;<code class="language-plaintext highlighter-rouge">dest</code></li>
  <li>Add <code class="language-plaintext highlighter-rouge">1</code>, <code class="language-plaintext highlighter-rouge">2</code>, and <code class="language-plaintext highlighter-rouge">3</code>.</li>
</ol>

<p>But how do we know which vertex is a <code class="language-plaintext highlighter-rouge">pivot</code>?</p>

<p>Run dijkstra 3 times with start node <code class="language-plaintext highlighter-rouge">src1</code>, <code class="language-plaintext highlighter-rouge">src2</code>, and <code class="language-plaintext highlighter-rouge">dest</code>(with inversed graph for this one).
And then we simply linear search all the vertices, assuming current vertex is a pivot.</p>

<p>Each calculation takes \(O(1)\), thanks to precalculated shortest distances.</p>

<blockquote>
  <p><strong>Note</strong><br />
use type <code class="language-plaintext highlighter-rouge">long long</code> to avoid integer overflow.</p>
</blockquote>

<h2 id="code">Code</h2>

<p><img src="/public/images/leetcode-2203-result.png" /></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#define f first
#define s second
</span><span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ull</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">pii</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="n">ll</span><span class="p">,</span><span class="n">ll</span><span class="o">&gt;</span> <span class="n">pll</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">vi</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">ll</span><span class="o">&gt;</span> <span class="n">vl</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">deque</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">di</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">deque</span><span class="o">&lt;</span><span class="n">ll</span><span class="o">&gt;</span> <span class="n">dl</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">priority_queue</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">vi</span><span class="p">,</span> <span class="n">less</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">maxHeap</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">priority_queue</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">vi</span><span class="p">,</span> <span class="n">greater</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">minHeap</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
<span class="nl">private:</span>
    <span class="kt">int</span> <span class="n">N</span><span class="p">;</span>
    <span class="n">ll</span> <span class="n">INF</span><span class="o">=</span> <span class="mf">1e12</span><span class="p">;</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="n">pii</span><span class="o">&gt;</span> <span class="n">adj</span><span class="p">[</span><span class="mi">100010</span><span class="p">],</span> <span class="n">adjInv</span><span class="p">[</span><span class="mi">100010</span><span class="p">];</span>

    <span class="n">vl</span> <span class="n">dijkstra</span><span class="p">(</span><span class="kt">int</span> <span class="n">src</span><span class="p">,</span> <span class="kt">bool</span> <span class="n">isInv</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">vl</span> <span class="n">dist</span><span class="p">(</span><span class="n">N</span><span class="p">,</span><span class="n">INF</span><span class="p">);</span>
        <span class="n">dist</span><span class="p">[</span><span class="n">src</span><span class="p">]</span><span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="n">priority_queue</span><span class="o">&lt;</span><span class="n">pll</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">pll</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">greater</span><span class="o">&lt;</span><span class="n">pll</span><span class="o">&gt;&gt;</span> <span class="n">pq</span><span class="p">;</span>
        <span class="n">pq</span><span class="p">.</span><span class="n">push</span><span class="p">({</span> <span class="mi">0</span><span class="p">,</span> <span class="n">src</span> <span class="p">});</span>
        <span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="n">pq</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span>
            <span class="n">ll</span> <span class="n">from</span><span class="o">=</span> <span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">s</span><span class="p">,</span> <span class="n">curDist</span><span class="o">=</span> <span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">f</span><span class="p">;</span>
            <span class="n">pq</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">curDist</span> <span class="o">&gt;</span> <span class="n">dist</span><span class="p">[</span><span class="n">from</span><span class="p">])</span> <span class="k">continue</span><span class="p">;</span>

            <span class="k">for</span> <span class="p">(</span><span class="n">pii</span> <span class="o">&amp;</span><span class="n">edge</span> <span class="o">:</span> <span class="p">(</span><span class="n">isInv</span> <span class="o">?</span> <span class="n">adjInv</span><span class="p">[</span><span class="n">from</span><span class="p">]</span> <span class="o">:</span> <span class="n">adj</span><span class="p">[</span><span class="n">from</span><span class="p">]))</span> <span class="p">{</span>
                <span class="n">ll</span> <span class="n">to</span><span class="o">=</span> <span class="n">edge</span><span class="p">.</span><span class="n">f</span><span class="p">,</span> <span class="n">cost</span><span class="o">=</span> <span class="n">dist</span><span class="p">[</span><span class="n">from</span><span class="p">]</span><span class="o">+</span><span class="n">edge</span><span class="p">.</span><span class="n">s</span><span class="p">;</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">cost</span> <span class="o">&lt;</span> <span class="n">dist</span><span class="p">[</span><span class="n">to</span><span class="p">])</span> <span class="p">{</span>
                    <span class="n">dist</span><span class="p">[</span><span class="n">to</span><span class="p">]</span><span class="o">=</span> <span class="n">cost</span><span class="p">;</span>
                    <span class="n">pq</span><span class="p">.</span><span class="n">push</span><span class="p">({</span> <span class="n">cost</span><span class="p">,</span> <span class="n">to</span> <span class="p">});</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">dist</span><span class="p">;</span>
    <span class="p">}</span>

<span class="nl">public:</span>
    <span class="n">ll</span> <span class="n">minimumWeight</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">vi</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">edges</span><span class="p">,</span> <span class="kt">int</span> <span class="n">src1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">src2</span><span class="p">,</span> <span class="kt">int</span> <span class="n">dest</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">N</span><span class="o">=</span> <span class="n">n</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">adj</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">clear</span><span class="p">();</span>
            <span class="n">adjInv</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">clear</span><span class="p">();</span>
        <span class="p">}</span>
        <span class="k">for</span> <span class="p">(</span><span class="k">auto</span> <span class="o">&amp;</span><span class="n">edge</span> <span class="o">:</span> <span class="n">edges</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">adj</span><span class="p">[</span><span class="n">edge</span><span class="p">[</span><span class="mi">0</span><span class="p">]].</span><span class="n">push_back</span><span class="p">({</span> <span class="n">edge</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">edge</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">});</span>
            <span class="n">adjInv</span><span class="p">[</span><span class="n">edge</span><span class="p">[</span><span class="mi">1</span><span class="p">]].</span><span class="n">push_back</span><span class="p">({</span> <span class="n">edge</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">edge</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">});</span>
        <span class="p">}</span>

        <span class="n">vl</span> <span class="n">d1</span><span class="o">=</span> <span class="n">dijkstra</span><span class="p">(</span><span class="n">src1</span><span class="p">,</span> <span class="nb">false</span><span class="p">);</span>
        <span class="n">vl</span> <span class="n">d2</span><span class="o">=</span> <span class="n">dijkstra</span><span class="p">(</span><span class="n">src2</span><span class="p">,</span> <span class="nb">false</span><span class="p">);</span>
        <span class="n">vl</span> <span class="n">d3</span><span class="o">=</span> <span class="n">dijkstra</span><span class="p">(</span><span class="n">dest</span><span class="p">,</span> <span class="nb">true</span><span class="p">);</span>
        <span class="n">ll</span> <span class="n">ret</span><span class="o">=</span> <span class="o">+</span><span class="n">INF</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">ret</span><span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">ret</span><span class="p">,</span> <span class="n">d1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">+</span><span class="n">d2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">+</span><span class="n">d3</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">ret</span> <span class="o">==</span> <span class="n">INF</span> <span class="o">?</span> <span class="o">-</span><span class="mi">1</span> <span class="o">:</span> <span class="n">ret</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<h2 id="complexity">Complexity</h2>

<ul>
  <li>Time: \(O(n + \vert{E}\vert\log{n})\)</li>
  <li>Space: \(O(n)\)</li>
</ul>]]></content><author><name>Junha Jeong</name></author><category term="competitive-programming" /><category term="Graph" /><category term="Dijkstra" /><summary type="html"><![CDATA[Leetcode Weekly 284 - Q4]]></summary></entry><entry><title type="html">[LeetCode] 309. Best Time to Buy and Sell Stock with Cooldown explained</title><link href="https://jooncco.github.io/competitive-programming/leetcode-309/" rel="alternate" type="text/html" title="[LeetCode] 309. Best Time to Buy and Sell Stock with Cooldown explained" /><published>2022-03-06T00:00:00+00:00</published><updated>2022-03-06T08:14:00+00:00</updated><id>https://jooncco.github.io/competitive-programming/leetcode-309</id><content type="html" xml:base="https://jooncco.github.io/competitive-programming/leetcode-309/"><![CDATA[<h2 id="problem">Problem</h2>

<p><a href="https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/">309. Best Time to Buy and Sell Stock with Cooldown</a></p>

<h2 id="approach">Approach</h2>

<p>There exists 3 states, and that can be expressed like this:<br />
<img src="/public/images/leetcode-309-figure-1.png" /></p>

<p>Hence, we can use <strong>dynamic programming</strong> approach to this problem, representing state transfers.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">holding[i]</code> = max( <code class="language-plaintext highlighter-rouge">holding[i-1]</code> , <code class="language-plaintext highlighter-rouge">notHolding[i-1]</code> - prices[i])</li>
  <li><code class="language-plaintext highlighter-rouge">notHolding[i]</code> = max( <code class="language-plaintext highlighter-rouge">notHolding[i-1]</code> , <code class="language-plaintext highlighter-rouge">cooldown[i-1]</code> )</li>
  <li><code class="language-plaintext highlighter-rouge">cooldown[i]</code> = <code class="language-plaintext highlighter-rouge">holding[i-1]</code> + prices[i]</li>
</ul>

<p>Initializing <strong>base case</strong> shouldn’t be difficult,</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">holding[0]</code> = -prices[0]</li>
  <li><code class="language-plaintext highlighter-rouge">notHolding[0]</code> = 0</li>
  <li><code class="language-plaintext highlighter-rouge">cooldown[0]</code> = \(-\infty\)</li>
</ul>

<p>The ultimate answer is \(\max(cooldown[n-1], notHolding[n-1])\).</p>

<blockquote>
  <p><strong>Note</strong><br />
We can optimize space complexity into \(O(1)\). Implementation below does that.</p>
</blockquote>

<h2 id="code">Code</h2>

<p><img src="/public/images/leetcode-309-result.png" /></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">typedef</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">vi</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
<span class="nl">private:</span>
    <span class="k">const</span> <span class="kt">int</span> <span class="n">NEG_INF</span><span class="o">=</span> <span class="o">-</span><span class="mf">1e7</span><span class="p">;</span>
<span class="nl">public:</span>
    <span class="kt">int</span> <span class="n">maxProfit</span><span class="p">(</span><span class="n">vi</span> <span class="o">&amp;</span><span class="n">prices</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">n</span><span class="o">=</span> <span class="n">prices</span><span class="p">.</span><span class="n">size</span><span class="p">(),</span> <span class="n">holding</span><span class="o">=</span> <span class="o">-</span><span class="n">prices</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">notHolding</span><span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">cooldown</span><span class="o">=</span> <span class="n">NEG_INF</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="kt">int</span> <span class="n">prevHolding</span><span class="o">=</span> <span class="n">holding</span><span class="p">;</span>
            <span class="n">holding</span><span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">holding</span><span class="p">,</span> <span class="n">notHolding</span><span class="o">-</span><span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
            <span class="n">notHolding</span><span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">notHolding</span><span class="p">,</span> <span class="n">cooldown</span><span class="p">);</span>
            <span class="n">cooldown</span><span class="o">=</span> <span class="n">prevHolding</span><span class="o">+</span><span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">max</span><span class="p">(</span><span class="n">cooldown</span><span class="p">,</span> <span class="n">notHolding</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<h2 id="complexity">Complexity</h2>

<ul>
  <li>Time: \(O(n)\)</li>
  <li>Space: \(O(n)\)</li>
</ul>]]></content><author><name>Junha Jeong</name></author><category term="competitive-programming" /><category term="Dynamic programming" /><summary type="html"><![CDATA[Dynamic Programming I - Day 8]]></summary></entry><entry><title type="html">[LeetCode] 714. Best Time to Buy and Sell Stock with Transaction Fee explained</title><link href="https://jooncco.github.io/competitive-programming/leetcode-714/" rel="alternate" type="text/html" title="[LeetCode] 714. Best Time to Buy and Sell Stock with Transaction Fee explained" /><published>2022-03-06T00:00:00+00:00</published><updated>2022-03-06T08:42:00+00:00</updated><id>https://jooncco.github.io/competitive-programming/leetcode-714</id><content type="html" xml:base="https://jooncco.github.io/competitive-programming/leetcode-714/"><![CDATA[<h2 id="problem">Problem</h2>

<p><a href="https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/">714. Best Time to Buy and Sell Stock with Transaction Fee</a></p>

<h2 id="approach">Approach</h2>

<h3 id="solution-1-dp">Solution 1: DP</h3>

<p>There exists 2 states, and those can be expressed as:<br />
<img src="/public/images/leetcode-714-figure-1.png" /></p>

<p>Hence, we can use <strong>dynamic programming</strong> approach to this problem, representing state transfers.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">holding[i]</code> = max( <code class="language-plaintext highlighter-rouge">holding[i-1]</code> , <code class="language-plaintext highlighter-rouge">notHolding[i-1]</code> - prices[i])</li>
  <li><code class="language-plaintext highlighter-rouge">notHolding[i]</code> = max( <code class="language-plaintext highlighter-rouge">notHolding[i-1]</code> , <code class="language-plaintext highlighter-rouge">holding[i-1]</code> + prices[i] - fee )</li>
</ul>

<p>Initializing <strong>base case</strong> shouldn’t be difficult,</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">holding[0]</code> = -prices[0]</li>
  <li><code class="language-plaintext highlighter-rouge">notHolding[0]</code> = 0</li>
</ul>

<p>The ultimate answer is \(\max(holding[n-1], notHolding[n-1])\).</p>

<blockquote>
  <p><strong>Note</strong><br />
We can optimize space complexity into \(O(1)\). Implementation below does that.</p>
</blockquote>

<h3 id="solution-2-dp--greedy">Solution 2: DP &amp; Greedy</h3>

<p>Example test cases tell us many things.<br />
<img src="/public/images/leetcode-714-figure-2.png" /></p>

<p>From left to right, update those values with following definitions.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">i</code>: current index</li>
  <li><code class="language-plaintext highlighter-rouge">curMin</code>: minimum price so far</li>
  <li><code class="language-plaintext highlighter-rouge">curMaxProfit</code>: maximum <strong>profit</strong> so far</li>
</ul>

<p>Say <code class="language-plaintext highlighter-rouge">i=4</code>, then <code class="language-plaintext highlighter-rouge">curMin</code> becomes 1 and <code class="language-plaintext highlighter-rouge">curMaxProfit</code> = 8 - 1 - 2(fee) = 5.<br />
Here we need to decide <strong>wether to buy <code class="language-plaintext highlighter-rouge">price[4]</code> or not</strong> and it is always <strong>optimal</strong> to buy it when:<br />
\(curMaxProfit + P - prices[i] - fee \gt P - curMin - fee\)<br />
\(curMaxProfit + \bcancel{P} - prices[i] - \cancel{fee} \gt \bcancel{P} - curMin - \cancel{fee}\)<br />
\(curMaxProfit \gt prices[i] - curMin\)<br />
where <code class="language-plaintext highlighter-rouge">P</code> denotes some huge price in the future.</p>

<p>Thus, we can pick prices to buy in a <strong>greedy way</strong>, by checking the above condition.<br />
From left to right,</p>

<ul>
  <li>if \(curMaxProfit \gt prices[i] - curMin\), then ans += <code class="language-plaintext highlighter-rouge">curMaxProfit</code>. prices[i] is a new <code class="language-plaintext highlighter-rouge">curMin</code> now.</li>
  <li>else if prices[i] &lt; <code class="language-plaintext highlighter-rouge">curMin</code>, update <code class="language-plaintext highlighter-rouge">curMin</code> value.</li>
  <li>else update <code class="language-plaintext highlighter-rouge">curMaxProfit</code> value</li>
</ul>

<h2 id="code">Code</h2>

<h3 id="solution-1-dp-1">Solution 1: DP</h3>

<p><img src="/public/images/leetcode-714-result-1.png" /></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">typedef</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">vi</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="kt">int</span> <span class="n">maxProfit</span><span class="p">(</span><span class="n">vi</span> <span class="o">&amp;</span><span class="n">prices</span><span class="p">,</span> <span class="kt">int</span> <span class="n">fee</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">n</span><span class="o">=</span> <span class="n">prices</span><span class="p">.</span><span class="n">size</span><span class="p">(),</span> <span class="n">holding</span><span class="o">=</span> <span class="o">-</span><span class="n">prices</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">notHolding</span><span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="kt">int</span> <span class="n">prevHolding</span><span class="o">=</span> <span class="n">holding</span><span class="p">;</span>
            <span class="n">holding</span><span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">prevHolding</span><span class="p">,</span> <span class="n">notHolding</span><span class="o">-</span><span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
            <span class="n">notHolding</span><span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">notHolding</span><span class="p">,</span> <span class="n">prevHolding</span><span class="o">+</span><span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-</span><span class="n">fee</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">max</span><span class="p">(</span><span class="n">holding</span><span class="p">,</span> <span class="n">notHolding</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<h3 id="solution-2-dp--greedy-1">Solution 2: DP &amp; Greedy</h3>

<p><img src="/public/images/leetcode-714-result-2.png" /></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">typedef</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">vi</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="kt">int</span> <span class="n">maxProfit</span><span class="p">(</span><span class="n">vi</span> <span class="o">&amp;</span><span class="n">prices</span><span class="p">,</span> <span class="kt">int</span> <span class="n">fee</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">n</span><span class="o">=</span> <span class="n">prices</span><span class="p">.</span><span class="n">size</span><span class="p">(),</span> <span class="n">curMin</span><span class="o">=</span> <span class="n">prices</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">curMaxProfit</span><span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">ans</span><span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">curMin</span> <span class="o">+</span> <span class="n">curMaxProfit</span> <span class="o">&gt;</span> <span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="p">{</span>
                <span class="n">ans</span> <span class="o">+=</span> <span class="n">curMaxProfit</span><span class="p">;</span>
                <span class="n">curMin</span><span class="o">=</span> <span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
                <span class="n">curMaxProfit</span><span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">curMin</span><span class="p">)</span> <span class="n">curMin</span><span class="o">=</span> <span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
            <span class="k">else</span> <span class="n">curMaxProfit</span><span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">curMaxProfit</span><span class="p">,</span> <span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-</span><span class="n">curMin</span><span class="o">-</span><span class="n">fee</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="n">ans</span> <span class="o">+=</span> <span class="n">curMaxProfit</span><span class="p">;</span>
        <span class="k">return</span> <span class="n">ans</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<h2 id="complexity">Complexity</h2>

<h3 id="solution-1">Solution 1</h3>

<ul>
  <li>Time: \(O(N)\)</li>
  <li>Space: \(O(N)\)</li>
</ul>

<h3 id="solution-2">Solution 2</h3>

<ul>
  <li>Time: \(O(N)\)</li>
  <li>Space: \(O(1)\)</li>
</ul>]]></content><author><name>Junha Jeong</name></author><category term="competitive-programming" /><category term="Dynamic programming" /><category term="Math" /><category term="Greedy" /><summary type="html"><![CDATA[Dynamic Programming I - Day 8]]></summary></entry></feed>