这些是旋转阵列的主题。区别在于主题的条件是不同的。旋转阵列是一个数组:高程顺序排列的阵列位于右侧,使整个数组形成左和右顺序间隔,以及左间隔大于右范围。例如。
两个问题153和33给出的条件均为,并且数组中的元素不同。153是为了找到最小值,33是找到给定值。两个问题154和81给出的条件是,并且可以重复数组中的元素。154是要找到最小值,81是找到给定值。
第一段不符合条件。目前,您可以根据条件执行两点,以找到左侧和右端的分界点。)
找到最小值,与找到给定值相比,这更简单。
153首先谈论找到最小值,从最简单的角度来看,阵列中没有153个问题。
在上一篇文章中的图形图片旋转之后,它可能形成左,右和右侧的两个部分。,等同于此时不旋转,这是一个总体顺序。您需要在以后编写代码时特别注意。
然后,当两点时,我们只需要判断当前的中点,是左侧是较大的范围,还是右侧的较小范围。
如何判断?每次我们有尊严时,我们都会知道3个位置的值:左点,右端和中点。我们可以使用这三个位置的值以及这些之间的大小之间的值确定我们在哪个间隔的三个位置。
因为没有重复元素,所以很容易知道
根据上述分析,您只需要在左右的左右判断,然后决定是左还是右。
确定它是否位于正确的间隔,我们有2个条件可使用
满足上述条件时,您需要更新
那么选择哪种条件?请注意。由于前面提到的,整个阵列旋转后仍可能相同。如果我们选择。然后,我们的代码仅在数组实际形成两个或右或正确的情况下才是位于正确的间隔,上述条件将是。
而且,如果我们选择的话,条件仍然处于有序的顺序(旋转后),并且条件仍在静止,当整体数组是有序的时,应将其留在左侧。
换句话说,当满足条件时,有2种情况
两种情况都需要向左左侧,您需要更新
如果选择,此条件仅包括第一种情况。因此,我们选择判断条件,从而减少需要编写的代码数量。
因此,除上述情况外,只有剩下的情况之一,也就是说
因为只有这种情况,您可以直接使用它,而最终代码如下。
上面的代码可以作为条件写入而不添加等量的情况。为什么?因为它永远不会可用。因为当我们要求中点时,我们使用它,也就是说,它必须比输入周期更大,也就是说,这是最小的。
33搜索给定值,33个问题的条件是数组中没有重复元素。该主题的基本情况与上述分析一致,因此我不会详细介绍。区别在于搜索不再是最有价值的,而是指定值。
我们首先编写经典的两个点框架,然后查看是否需要进行一些精细的态度或特殊判断。
假设总体数组顺序,请找到某个元素的两个点算法框架,如下
下一个罚款。
首先看第一个条件。满足时,正常情况是在右边找到。
如果数组是有序的,并且位置小于目标值,则有必要找到右侧的左边界。
然后,让我们看一下旋转数组是否有任何区别。使用(√)。
总而言之,当时,只有当较低范围位于右侧并且右间隔的最大值很小时,该是时候在左侧找到它了。
因此,我们修改了此部分的代码,如下
代码中的条件是属于正确的间隔,并且
特别关注的是,关于153个问题的分析,可以使用2条条件来判断
因为目前我们需要确保它在正确的范围内,因此我们只能选择。
为什么?因为阵列有序时,此条件也将是。因此,使用不保证它必须属于正确的间隔。
结合问题153,让我们总结一下。
该判断实际上包括两种情况
该判断仅与第二种情况相对应(因为整体数组是有序的,因此位置的元素不能大于左侧的元素)。
在153个问题中,我们选择此条件以兼容数组的整体顺序并减少代码数。
这里的第33个问题必须确保其位于正确的间隔中,因此只能选择它。
因此,对于代码的这一部分,它已经完成:
再次查看第二个条件。满足时,正常在左侧找到它是正常的。
只有当左侧的最小值和左侧间隔仍然比答案位于右侧较小范围时更大时,您需要在右侧找到它。判断位于左间隔,可以选择两个条件:
与上述类似,添加了数组的附加顺序,因此只能在此处选择。
如下完成代码的这一部分
因此,我们的代码完成:
154接下来看到高级版本,数组中有重复的元素。
首先查看154个问题并找到最有价值的问题。基本情况与上述相似,但由于可能存在重复性元素,因此是不同的。如果旋转后不保留数组,则形成状态如图所示。下图(源leetcode)。我们仍然使用两点,我们仍然需要每次判断。
当它位于正确的间隔时,将满足以下两个条件
同样,它在旋转阵列后包含原始情况。
但是,我们不能使用这两个条件来判断正确的间隔。这些条件仅在正确的间隔内需要,而不是足够的条件。(在正确的间隔时,必须满足这两个条件;但是当满足这两个条件时,不一定在正确的间隔中)
原因是有重复的元素,因此可以获得上述条件。
在这种情况下,我们尝试在条件下删除相等的数字:
与153相似,它包含数组的有序顺序以及正确的间隔。左侧都需要发现情况和两种情况。(这可能是答案本身,因此有必要更新)
因此,在满足时,您可以在左侧确定答案。
类似,当它位于左侧时,它将满足
同样,为了能够使用这两个条件,我们将首先删除等待号码
同样,它包括两种情况:数组的总顺序和左间隔的情况。但是我们必须在此时查看右侧,因此我们只能选择。
最后,目前,目前,我们无法确定最小值是在左侧还是右侧,而是因为位置和位置相同,并且不相等。因此,我们至少可以删除数字(首先,一个数字)在此位置,而不缺少最小值。
总而言之,代码如下
在81的末尾,该数组具有重复的元素以找到指定的值。
同样,首先写经典dictat
与33相似,当时通常可以找到右侧。您想找到它吗?仅在正确的间隔中找到它,而正确间隔的最大值仍然小于时间。
关键在于在正确的间隔上进行判断,这与33的不同之处。LET查看在正确的间隔时遇到什么条件?
还要先删除等量的数字
我们需要确保其位于正确的间隔,因此选择上面的第一个条件实际上与33个问题相同。
但是当时,我们无法确定答案的哪一侧。但是我们至少可以消除这一立场。
以同样的方式,第二个条件是相似的,我不会详细介绍。
直接给出完整的代码如下
在这一点上,旋转数序列已经结束。总而言之,更关键的部分是中间点位于左间隔或右间隔的判断中,以及如何合理地使用相应条件来实现目标(与不同情况兼容以减少代码量,或准确确认某种情况)。
原始:https://juejin.cn/post/7096319767966908452