This commit is contained in:
krahets
2023-12-02 06:24:11 +08:00
parent 5783c402bf
commit d20d8b3ee1
107 changed files with 1685 additions and 1745 deletions

View File

@ -3425,7 +3425,7 @@
<h2 id="1031">10.3.1 &nbsp; 查找左边界<a class="headerlink" href="#1031" title="Permanent link">&para;</a></h2>
<div class="admonition question">
<p class="admonition-title">Question</p>
<p>给定一个长度为 <span class="arithmatex">\(n\)</span> 的有序数组 <code>nums</code> 数组可能包含重复元素。请返回数组中最左一个元素 <code>target</code> 的索引。若数组中不包含该元素,则返回 <span class="arithmatex">\(-1\)</span></p>
<p>给定一个长度为 <span class="arithmatex">\(n\)</span> 的有序数组 <code>nums</code> 其中可能包含重复元素。请返回数组中最左一个元素 <code>target</code> 的索引。若数组中不包含该元素,则返回 <span class="arithmatex">\(-1\)</span></p>
</div>
<p>回忆二分查找插入点的方法,搜索完成后 <span class="arithmatex">\(i\)</span> 指向最左一个 <code>target</code> <strong>因此查找插入点本质上是在查找最左一个 <code>target</code> 的索引</strong></p>
<p>考虑通过查找插入点的函数实现查找左边界。请注意,数组中可能不包含 <code>target</code> ,这种情况可能导致以下两种结果。</p>
@ -3433,7 +3433,7 @@
<li>插入点的索引 <span class="arithmatex">\(i\)</span> 越界。</li>
<li>元素 <code>nums[i]</code><code>target</code> 不相等。</li>
</ul>
<p>当遇到以上两种情况时,直接返回 <span class="arithmatex">\(-1\)</span> 即可。</p>
<p>当遇到以上两种情况时,直接返回 <span class="arithmatex">\(-1\)</span> 即可。代码如下所示:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="1:12"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><input id="__tabbed_1_6" name="__tabbed_1" type="radio" /><input id="__tabbed_1_7" name="__tabbed_1" type="radio" /><input id="__tabbed_1_8" name="__tabbed_1" type="radio" /><input id="__tabbed_1_9" name="__tabbed_1" type="radio" /><input id="__tabbed_1_10" name="__tabbed_1" type="radio" /><input id="__tabbed_1_11" name="__tabbed_1" type="radio" /><input id="__tabbed_1_12" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Python</label><label for="__tabbed_1_2">C++</label><label for="__tabbed_1_3">Java</label><label for="__tabbed_1_4">C#</label><label for="__tabbed_1_5">Go</label><label for="__tabbed_1_6">Swift</label><label for="__tabbed_1_7">JS</label><label for="__tabbed_1_8">TS</label><label for="__tabbed_1_9">Dart</label><label for="__tabbed_1_10">Rust</label><label for="__tabbed_1_11">C</label><label for="__tabbed_1_12">Zig</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
@ -3595,7 +3595,7 @@
</div>
</div>
<h2 id="1032">10.3.2 &nbsp; 查找右边界<a class="headerlink" href="#1032" title="Permanent link">&para;</a></h2>
<p>那么如何查找最右一个 <code>target</code> 呢?最直接的方式是修改代码,替换在 <code>nums[m] == target</code> 情况下的指针收缩操作。代码在此省略,有兴趣的同学可以自行实现。</p>
<p>那么如何查找最右一个 <code>target</code> 呢?最直接的方式是修改代码,替换在 <code>nums[m] == target</code> 情况下的指针收缩操作。代码在此省略,有兴趣的读者可以自行实现。</p>
<p>下面我们介绍两种更加取巧的方法。</p>
<h3 id="1">1. &nbsp; 复用查找左边界<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3>
<p>实际上,我们可以利用查找最左元素的函数来查找最右元素,具体方法为:<strong>将查找最右一个 <code>target</code> 转化为查找最左一个 <code>target + 1</code></strong></p>
@ -3603,7 +3603,7 @@
<p><a class="glightbox" href="../binary_search_edge.assets/binary_search_right_edge_by_left_edge.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="将查找右边界转化为查找左边界" class="animation-figure" src="../binary_search_edge.assets/binary_search_right_edge_by_left_edge.png" /></a></p>
<p align="center"> 图 10-7 &nbsp; 将查找右边界转化为查找左边界 </p>
<p>请注意,返回的插入点是 <span class="arithmatex">\(i\)</span> ,因此需要将其减 <span class="arithmatex">\(1\)</span> ,从而获得 <span class="arithmatex">\(j\)</span> </p>
<p>请注意,返回的插入点是 <span class="arithmatex">\(i\)</span> ,因此需要将其减 <span class="arithmatex">\(1\)</span> ,从而获得 <span class="arithmatex">\(j\)</span> </p>
<div class="tabbed-set tabbed-alternate" data-tabs="2:12"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><input id="__tabbed_2_3" name="__tabbed_2" type="radio" /><input id="__tabbed_2_4" name="__tabbed_2" type="radio" /><input id="__tabbed_2_5" name="__tabbed_2" type="radio" /><input id="__tabbed_2_6" name="__tabbed_2" type="radio" /><input id="__tabbed_2_7" name="__tabbed_2" type="radio" /><input id="__tabbed_2_8" name="__tabbed_2" type="radio" /><input id="__tabbed_2_9" name="__tabbed_2" type="radio" /><input id="__tabbed_2_10" name="__tabbed_2" type="radio" /><input id="__tabbed_2_11" name="__tabbed_2" type="radio" /><input id="__tabbed_2_12" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">Python</label><label for="__tabbed_2_2">C++</label><label for="__tabbed_2_3">Java</label><label for="__tabbed_2_4">C#</label><label for="__tabbed_2_5">Go</label><label for="__tabbed_2_6">Swift</label><label for="__tabbed_2_7">JS</label><label for="__tabbed_2_8">TS</label><label for="__tabbed_2_9">Dart</label><label for="__tabbed_2_10">Rust</label><label for="__tabbed_2_11">C</label><label for="__tabbed_2_12">Zig</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
@ -3796,7 +3796,7 @@
<p><a class="glightbox" href="../binary_search_edge.assets/binary_search_edge_by_element.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="将查找边界转化为查找元素" class="animation-figure" src="../binary_search_edge.assets/binary_search_edge_by_element.png" /></a></p>
<p align="center"> 图 10-8 &nbsp; 将查找边界转化为查找元素 </p>
<p>代码在此省略,值得注意以下两点。</p>
<p>代码在此省略,以下两点值得注意</p>
<ul>
<li>给定数组不包含小数,这意味着我们无须关心如何处理相等的情况。</li>
<li>因为该方法引入了小数,所以需要将函数中的变量 <code>target</code> 改为浮点数类型。</li>