<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>sp Archives - Huahua&#039;s Tech Road</title>
	<atom:link href="https://zxi.mytechroad.com/blog/tag/sp/feed/" rel="self" type="application/rss+xml" />
	<link>https://zxi.mytechroad.com/blog/tag/sp/</link>
	<description></description>
	<lastBuildDate>Tue, 14 Apr 2020 03:39:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.8</generator>

<image>
	<url>https://zxi.mytechroad.com/blog/wp-content/uploads/2017/09/cropped-photo-32x32.jpg</url>
	<title>sp Archives - Huahua&#039;s Tech Road</title>
	<link>https://zxi.mytechroad.com/blog/tag/sp/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>KMP Algorithm SP19</title>
		<link>https://zxi.mytechroad.com/blog/sp/kmp-algorithm-sp19/</link>
					<comments>https://zxi.mytechroad.com/blog/sp/kmp-algorithm-sp19/#respond</comments>
		
		<dc:creator><![CDATA[zxi]]></dc:creator>
		<pubDate>Wed, 01 Apr 2020 03:29:45 +0000</pubDate>
				<category><![CDATA[SP]]></category>
		<category><![CDATA[kmp]]></category>
		<category><![CDATA[prefix]]></category>
		<category><![CDATA[sp]]></category>
		<category><![CDATA[suffix]]></category>
		<guid isPermaLink="false">https://zxi.mytechroad.com/blog/?p=6556</guid>

					<description><![CDATA[<p>KMP Algorithm, KMP 字符串搜索算法 Time complexity: O(m+n)Space complexity: O(m) Implementation [crayon-663aec1e88862004263179/] [crayon-663aec1e88866211390896/] Applications LeetCode 28. strStr() [crayon-663aec1e88869959759160/] LeetCode 459.&#160;Repeated Substring Pattern [crayon-663aec1e8886a094117202/] 1392.&#160;Longest Happy Prefix&#8230;</p>
<p>The post <a rel="nofollow" href="https://zxi.mytechroad.com/blog/sp/kmp-algorithm-sp19/">KMP Algorithm SP19</a> appeared first on <a rel="nofollow" href="https://zxi.mytechroad.com/blog">Huahua&#039;s Tech Road</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="花花酱 KMP Algorithm - 刷题找工作 SP19" width="500" height="375" src="https://www.youtube.com/embed/uKr9qIZMtzw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div></figure>



<p>KMP Algorithm, KMP 字符串搜索算法</p>



<p>Time complexity: O(m+n)<br>Space complexity: O(m)</p>



<h2><strong>Implementation</strong></h2>



<div class="responsive-tabs">
<h2 class="tabtitle">C++</h2>
<div class="tabcontent">

<pre class="crayon-plain-tag">#include &lt;iostream&gt;
#include &lt;vector&gt;
using namespace std;

// Author: Huahua
namespace KMP {
vector&lt;int&gt; Build(const string&amp; p) {
  const int m = p.length();
  vector&lt;int&gt; nxt{0, 0};
  for (int i = 1, j = 0; i &lt; m; ++i) {
    while (j &gt; 0 &amp;&amp; p[i] != p[j])
      j = nxt[j];
    if (p[i] == p[j])
      ++j;
    nxt.push_back(j);
  }
  return nxt;
}

vector&lt;int&gt; Match(const string&amp; s, const string&amp; p) {
  vector&lt;int&gt; nxt(Build(p));
  vector&lt;int&gt; ans;
  const int n = s.length();
  const int m = p.length();
  for (int i = 0, j = 0; i &lt; n; ++i) {
    while (j &gt; 0 &amp;&amp; s[i] != p[j])
      j = nxt[j];
    if (s[i] == p[j])
      ++j;
    if (j == m) {
      ans.push_back(i - m + 1);
      j = nxt[j];
    }
  }
  return ans;
}
};  // namespace KMP

void CheckEQ(const vector&lt;int&gt;&amp; actual, const vector&lt;int&gt;&amp; expected) {
  if (actual != expected) {
    std::cout &lt;&lt; &quot;expected:&quot;;
    for (int v : expected)
      std::cout &lt;&lt; &quot; &quot; &lt;&lt; v;
    std::cout &lt;&lt; &quot; actual:&quot;;
    for (int v : actual)
      std::cout &lt;&lt; &quot; &quot; &lt;&lt; v;
    std::cout &lt;&lt; std::endl;
  } else {
    std::cout &lt;&lt; &quot;PASS&quot; &lt;&lt; std::endl;
  }
}

int main(int argc, char** argv) {
  CheckEQ(KMP::Build(&quot;ABCDABD&quot;), {0, 0, 0, 0, 0, 1, 2, 0});
  CheckEQ(KMP::Build(&quot;AB&quot;), {0, 0, 0});
  CheckEQ(KMP::Build(&quot;A&quot;), {0, 0});
  CheckEQ(KMP::Build(&quot;AA&quot;), {0, 0, 1});
  CheckEQ(KMP::Build(&quot;AAA&quot;), {0, 0, 1, 2});
  CheckEQ(KMP::Build(&quot;AABA&quot;), {0, 0, 1, 0, 1});
  CheckEQ(KMP::Match(&quot;ABC ABCDAB ABCDABCDABDE&quot;, &quot;ABCDABD&quot;), {15});
  CheckEQ(KMP::Match(&quot;ABC ABCDAB ABCDABCDABDE&quot;, &quot;AB&quot;), {0, 4, 8, 11, 15, 19});
  CheckEQ(KMP::Match(&quot;ABC ABCDAB ABCDABCDABDE&quot;, &quot;B&quot;), {1, 5, 9, 12, 16, 20});
  CheckEQ(KMP::Match(&quot;AAAAA&quot;, &quot;A&quot;), {0, 1, 2, 3, 4});
  CheckEQ(KMP::Match(&quot;AAAAA&quot;, &quot;AA&quot;), {0, 1, 2, 3});
  CheckEQ(KMP::Match(&quot;AAAAA&quot;, &quot;AAA&quot;), {0, 1, 2});
  CheckEQ(KMP::Match(&quot;ABC&quot;, &quot;ABC&quot;), {0});
  return 0;
}</pre>

</div><h2 class="tabtitle">Python3</h2>
<div class="tabcontent">

<pre class="crayon-plain-tag">#!/usr/bin/env python3
from typing import List

# Author: Huahua


def Build(p: str) -&gt; List[int]:
    m = len(p)
    nxt = [0, 0]
    j = 0
    for i in range(1, m):
        while j &gt; 0 and p[i] != p[j]:
            j = nxt[j]
        if p[i] == p[j]:
            j += 1
        nxt.append(j)
    return nxt


def Match(s: str, p: str) -&gt; List[int]:
    n, m = len(s), len(p)
    nxt = Build(p)
    ans = []
    j = 0
    for i in range(n):
        while j &gt; 0 and s[i] != p[j]:
            j = nxt[j]
        if s[i] == p[j]:
            j += 1
        if j == m:
            ans.append(i - m + 1)
            j = nxt[j]
    return ans


def CheckEQ(actual, expected):
    if actual != expected:
        print('actual: %s, expected: %s' % (actual, expected))
    else:
        print('Pass')


if __name__ == &quot;__main__&quot;:
    CheckEQ(Build(&quot;ABCDABD&quot;), [0, 0, 0, 0, 0, 1, 2, 0])
    CheckEQ(Build(&quot;AB&quot;), [0, 0, 0])
    CheckEQ(Build(&quot;A&quot;), [0, 0])
    CheckEQ(Build(&quot;AA&quot;), [0, 0, 1])
    CheckEQ(Build(&quot;AAAA&quot;), [0, 0, 1, 2, 3])
    CheckEQ(Build(&quot;AABA&quot;), [0, 0, 1, 0, 1])
    CheckEQ(Match(&quot;ABC ABCDAB ABCDABCDABDE&quot;, &quot;ABCDABD&quot;), [15])
    CheckEQ(Match(&quot;ABC ABCDAB ABCDABCDABDE&quot;, &quot;AB&quot;), [0, 4, 8, 11, 15, 19])
    CheckEQ(Match(&quot;ABC ABCDAB ABCDABCDABDE&quot;, &quot;B&quot;), [1, 5, 9, 12, 16, 20])
    CheckEQ(Match(&quot;AAAAA&quot;, &quot;A&quot;), [0, 1, 2, 3, 4])
    CheckEQ(Match(&quot;AAAAA&quot;, &quot;AA&quot;), [0, 1, 2, 3])
    CheckEQ(Match(&quot;AAAAA&quot;, &quot;AAAA&quot;), [0, 1])
    CheckEQ(Match(&quot;AAAAA&quot;, &quot;AAAAA&quot;), [0])
    CheckEQ(Match(&quot;AABAABA&quot;, &quot;AABA&quot;), [0, 3])</pre>
</div></div>



<h2><strong>Applications</strong></h2>



<p>LeetCode 28. strStr()</p>



<div class="responsive-tabs">
<h2 class="tabtitle">C++</h2>
<div class="tabcontent">

<pre class="crayon-plain-tag">// Author: Huahua
class Solution {
public:
  int strStr(string haystack, string needle) {
    if (needle.empty()) return 0;
    auto matches = KMP::Match(haystack, needle);
    return matches.empty() ? -1 : matches[0];
  }
};</pre>
</div></div>



<p>LeetCode 459.&nbsp;Repeated Substring Pattern</p>



<div class="responsive-tabs">
<h2 class="tabtitle">C++</h2>
<div class="tabcontent">

<pre class="crayon-plain-tag">// Author: Huahua
class Solution {
public:
  bool repeatedSubstringPattern(string str) {
    const int n = str.length();
    auto nxt = KMP::Build(str);
    return nxt[n] &amp;amp;&amp;amp; nxt[n] % (n - nxt[n]) == 0;
  }
};</pre>
</div></div>



<p><a href="https://zxi.mytechroad.com/blog/string/leetcode-1392-longest-happy-prefix/">1392.&nbsp;Longest Happy Prefix</a></p>



<div class="responsive-tabs">
<h2 class="tabtitle">C++</h2>
<div class="tabcontent">

<pre class="crayon-plain-tag">// Author: Huahua
class Solution {
public:
  string longestPrefix(const string&amp;amp; s) {    
    return s.substr(0, KMP::Build(s).back());
  }
};</pre>
</div></div>



<p></p>
<p>The post <a rel="nofollow" href="https://zxi.mytechroad.com/blog/sp/kmp-algorithm-sp19/">KMP Algorithm SP19</a> appeared first on <a rel="nofollow" href="https://zxi.mytechroad.com/blog">Huahua&#039;s Tech Road</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://zxi.mytechroad.com/blog/sp/kmp-algorithm-sp19/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>花花酱 Binary Search II SP17</title>
		<link>https://zxi.mytechroad.com/blog/sp/binary-search-ii-sp17/</link>
					<comments>https://zxi.mytechroad.com/blog/sp/binary-search-ii-sp17/#respond</comments>
		
		<dc:creator><![CDATA[zxi]]></dc:creator>
		<pubDate>Sat, 20 Apr 2019 16:48:35 +0000</pubDate>
				<category><![CDATA[SP]]></category>
		<category><![CDATA[binary search]]></category>
		<category><![CDATA[sp]]></category>
		<guid isPermaLink="false">https://zxi.mytechroad.com/blog/?p=5082</guid>

					<description><![CDATA[<p>Binary Search I SP5 For the given function g(x) and a range [l, r] find the smallest int number m such that g(m) is True,&#8230;</p>
<p>The post <a rel="nofollow" href="https://zxi.mytechroad.com/blog/sp/binary-search-ii-sp17/">花花酱 Binary Search II SP17</a> appeared first on <a rel="nofollow" href="https://zxi.mytechroad.com/blog">Huahua&#039;s Tech Road</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe width="500" height="375" src="https://www.youtube.com/embed/J-IQxfYRTto?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div></figure>



<p><a href="https://zxi.mytechroad.com/blog/sp/sp5-binary-search/">Binary Search I SP5</a></p>



<p>For the given function g(x) and a range [l, r] find the smallest int number m such that g(m) is True, if not found, return r + 1.</p>



<figure class="wp-block-image"><img width="960" height="540" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/1.png" alt="" class="wp-image-5084" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/1.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/1-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/1-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></figure>



<figure class="wp-block-image"><img width="960" height="540" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/2.png" alt="" class="wp-image-5085" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/2.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/2-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/2-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></figure>



<figure class="wp-block-image"><img width="960" height="540" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/3.png" alt="" class="wp-image-5086" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/3.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/3-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/3-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></figure>



<figure class="wp-block-image"><img width="960" height="540" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/4.png" alt="" class="wp-image-5087" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/4.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/4-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/4-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></figure>



<figure class="wp-block-image"><img width="960" height="540" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/5.png" alt="" class="wp-image-5088" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/5.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/5-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/5-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></figure>



<figure class="wp-block-image"><img width="960" height="540" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/6.png" alt="" class="wp-image-5089" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/6.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/6-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2019/04/6-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></figure>
<p>The post <a rel="nofollow" href="https://zxi.mytechroad.com/blog/sp/binary-search-ii-sp17/">花花酱 Binary Search II SP17</a> appeared first on <a rel="nofollow" href="https://zxi.mytechroad.com/blog">Huahua&#039;s Tech Road</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://zxi.mytechroad.com/blog/sp/binary-search-ii-sp17/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>花花酱 LeetCode Binary Trees 二叉树 SP12</title>
		<link>https://zxi.mytechroad.com/blog/sp/leetcode-binary-trees-sp12/</link>
					<comments>https://zxi.mytechroad.com/blog/sp/leetcode-binary-trees-sp12/#respond</comments>
		
		<dc:creator><![CDATA[zxi]]></dc:creator>
		<pubDate>Sun, 16 Dec 2018 18:24:48 +0000</pubDate>
				<category><![CDATA[SP]]></category>
		<category><![CDATA[BST]]></category>
		<category><![CDATA[sp]]></category>
		<category><![CDATA[tree]]></category>
		<guid isPermaLink="false">https://zxi.mytechroad.com/blog/?p=4449</guid>

					<description><![CDATA[<p>Binary tree is one of the most frequently asked question type during interview. 二叉树是面试中经常会问到的问题。 The candidate needs to understand the recursively defined TreeNode and solve&#8230;</p>
<p>The post <a rel="nofollow" href="https://zxi.mytechroad.com/blog/sp/leetcode-binary-trees-sp12/">花花酱 LeetCode Binary Trees 二叉树 SP12</a> appeared first on <a rel="nofollow" href="https://zxi.mytechroad.com/blog">Huahua&#039;s Tech Road</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><iframe width="500" height="375" src="https://www.youtube.com/embed/PbGl8_-bZxI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>
<p>Binary tree is one of the most frequently asked question type during interview.</p>
<p>二叉树是面试中经常会问到的问题。</p>
<p>The candidate needs to understand the recursively defined TreeNode and solve the problem through recursion.</p>
<p>面试者需要理解递归定义的TreeNode数据类型，并且通过使用递归的方式来解决问题。</p>
<p>&nbsp;</p>
<p><img class="alignnone size-large wp-image-4450" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-1.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-1.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-1-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-1-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /><br />
<img class="alignnone size-large wp-image-4451" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-2.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-2.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-2-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-2-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /><br />
<img class="alignnone size-large wp-image-4452" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-3.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-3.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-3-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-3-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /><br />
<img class="alignnone size-large wp-image-4453" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-4.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-4.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-4-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-4-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /><br />
<img class="alignnone size-large wp-image-4454" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-5.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-5.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-5-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-5-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /><br />
<img class="alignnone size-large wp-image-4455" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-6.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-6.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-6-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-6-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /><br />
<img class="alignnone size-large wp-image-4456" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-7.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-7.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-7-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-7-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /><br />
<img class="alignnone size-large wp-image-4457" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-8.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-8.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-8-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-8-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /><br />
<img class="alignnone size-large wp-image-4458" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-9.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-9.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-9-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-9-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /><br />
<img class="alignnone size-large wp-image-4459" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-10.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-10.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-10-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/12/sp12-10-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p>The post <a rel="nofollow" href="https://zxi.mytechroad.com/blog/sp/leetcode-binary-trees-sp12/">花花酱 LeetCode Binary Trees 二叉树 SP12</a> appeared first on <a rel="nofollow" href="https://zxi.mytechroad.com/blog">Huahua&#039;s Tech Road</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://zxi.mytechroad.com/blog/sp/leetcode-binary-trees-sp12/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>花花酱 SP5 Binary Search</title>
		<link>https://zxi.mytechroad.com/blog/sp/sp5-binary-search/</link>
					<comments>https://zxi.mytechroad.com/blog/sp/sp5-binary-search/#respond</comments>
		
		<dc:creator><![CDATA[zxi]]></dc:creator>
		<pubDate>Mon, 13 Aug 2018 06:41:04 +0000</pubDate>
				<category><![CDATA[Binary Search]]></category>
		<category><![CDATA[SP]]></category>
		<category><![CDATA[binary search]]></category>
		<category><![CDATA[boundary]]></category>
		<category><![CDATA[sp]]></category>
		<guid isPermaLink="false">https://zxi.mytechroad.com/blog/?p=3504</guid>

					<description><![CDATA[<p>Template: Time complexity: O(log(r-l)) * O(f(m) + g(m)) Space complexity: O(1) [crayon-663aec1e88dff536386609/] &#160; Slides: Lower Bound / Upper Bound [crayon-663aec1e88e02815815532/] Mentioned Problems 花花酱 LeetCode. 69&#8230;</p>
<p>The post <a rel="nofollow" href="https://zxi.mytechroad.com/blog/sp/sp5-binary-search/">花花酱 SP5 Binary Search</a> appeared first on <a rel="nofollow" href="https://zxi.mytechroad.com/blog">Huahua&#039;s Tech Road</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><iframe width="500" height="375" src="https://www.youtube.com/embed/v57lNF2mb_s?feature=oembed" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe></p>
<p>Template:</p>
<p>Time complexity: O(log(r-l)) * O(f(m) + g(m))</p>
<p>Space complexity: O(1)</p><pre class="crayon-plain-tag">"""
Returns the smallest number m such that g(m) is true.
"""
def binary_search(l, r):
  while l &lt; r:
    m = l + (r - l) // 2
    if f(m): return m    # if m is the answer
    if g(m):
      r = m              # new range [l, m)
    else
      l = m + 1          # new range [m+1, r)
  return l               # or not found</pre><p>&nbsp;</p>
<p>Slides:</p>
<p><img class="alignnone size-full wp-image-3510" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-1.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-1.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-1-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-1-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p><img class="alignnone size-full wp-image-3509" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-2.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-2.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-2-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-2-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p><img class="alignnone size-full wp-image-3508" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-3.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-3.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-3-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-3-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p><img class="alignnone size-full wp-image-3507" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-4.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-4.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-4-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-4-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p><img class="alignnone size-full wp-image-3506" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-5.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-5.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-5-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-5-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /><img class="alignnone size-full wp-image-3505" src="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-6.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-6.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-6-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/08/sp5-6-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p>Lower Bound / Upper Bound</p><pre class="crayon-plain-tag">#include &lt;iostream&gt;
#include &lt;vector&gt;
using namespace std;

int upper_bound(const vector&lt;int&gt;&amp; A, int val, int l, int r) {
  while (l &lt; r) {
    int m = l + (r - l) / 2;
    if (A[m] &gt; val)
      r = m;
    else      
      l = m + 1;
  }
  return l;
}

int lower_bound(const vector&lt;int&gt;&amp; A, int val, int l, int r) {
  while (l &lt; r) {
    int m = l + (r - l) / 2;
    if (A[m] &gt;= val)
      r = m;
    else
      l = m + 1;
  }
  return l;
}

int main() {
  vector&lt;int&gt; A{1, 2, 2, 2, 4, 4, 5};
  cout &lt;&lt; lower_bound(A, 0, 0, A.size()) &lt;&lt; endl; // 0
  cout &lt;&lt; lower_bound(A, 2, 0, A.size()) &lt;&lt; endl; // 1
  cout &lt;&lt; lower_bound(A, 3, 0, A.size()) &lt;&lt; endl; // 4
  cout &lt;&lt; upper_bound(A, 2, 0, A.size()) &lt;&lt; endl; // 4
  cout &lt;&lt; upper_bound(A, 4, 0, A.size()) &lt;&lt; endl; // 6
  cout &lt;&lt; upper_bound(A, 5, 0, A.size()) &lt;&lt; endl; // 7
}</pre><p></p>
<h1><strong>Mentioned Problems</strong></h1>
<ul>
<li><a href="https://zxi.mytechroad.com/blog/math/leetcode-69-sqrtx/">花花酱 LeetCode. 69 Sqrt(x)</a></li>
<li><a href="https://zxi.mytechroad.com/blog/algorithms/array/leetcode-704-binary-search/">花花酱 LeetCode 704. Binary Search</a></li>
<li><a href="https://zxi.mytechroad.com/blog/algorithms/binary-search/leetcode-875-koko-eating-bananas/">花花酱 LeetCode 875. Koko Eating Bananas</a></li>
<li><a href="https://zxi.mytechroad.com/blog/algorithms/binary-search/leetcode-378-kth-smallest-element-in-a-sorted-matrix/">花花酱 LeetCode 378. Kth Smallest Element in a Sorted Matrix</a></li>
</ul>
<p>The post <a rel="nofollow" href="https://zxi.mytechroad.com/blog/sp/sp5-binary-search/">花花酱 SP5 Binary Search</a> appeared first on <a rel="nofollow" href="https://zxi.mytechroad.com/blog">Huahua&#039;s Tech Road</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://zxi.mytechroad.com/blog/sp/sp5-binary-search/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
