当前位置:首页 > 经验 >

换底公式推导图片(换底公式的推论及推导)

来源:原点资讯(www.yd166.com)时间:2022-11-07 05:24:52作者:YD166手机阅读>>

题目描述

Tag : 「二分」、「三分」

符合下列属性的数组 arr 称为 山脉数组 :

  • arr.length >= 3
  • 存在 i(0 < i < arr.length - 1) 使得:arr[0] < arr[1] < ... arr[i-1] < arr[i]arr[i] > arr[i 1] > ... > arr[arr.length - 1]

给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i 1] > ... > arr[arr.length - 1] 的下标 i 。

示例 1:

输入:arr = [0,1,0] 输出:1

示例 2:

输入:arr = [0,2,1,0] 输出:1

示例 3:

输入:arr = [0,10,5,2] 输出:1

示例 4:

输入:arr = [3,4,5,1] 输出:2

示例 5:

输入:arr = [24,69,100,99,79,78,67,36,26,19] 输出:2

提示:

换底公式推导图片,换底公式的推论及推导(1)

二分

往常我们使用「二分」进行查值,需要确保序列本身满足「二段性」:当选定一个端点(基准值)后,结合「一段满足 & 另一段不满足」的特性来实现“折半”的查找效果。

但本题求的是峰顶索引值,如果我们选定数组头部或者尾部元素,其实无法根据大小关系“直接”将数组分成两段。

但可以利用题目发现如下性质:由于 arr 数值各不相同,因此峰顶元素左侧必然满足严格单调递增,峰顶元素右侧必然不满足。

因此 以峰顶元素为分割点的 arr 数组,根据与 前一元素/后一元素 的大小关系,具有二段性:

换底公式推导图片,换底公式的推论及推导(2)

因此我们可以选择任意条件,写出若干「二分」版本。

代码:

class Solution { // 根据 arr[i-1] < arr[i] 在 [1,n-1] 范围内找值 // 峰顶元素为符合条件的最靠近中心的元素 public int peakIndexInMountainArray(int[] arr) { int n = arr.length; int l = 1, r = n - 1; while (l < r) { int mid = l r 1 >> 1; if (arr[mid - 1] < arr[mid]) l = mid; else r = mid - 1; } return r; } }

class Solution { // 根据 arr[i] > arr[i 1] 在 [0,n-2] 范围内找值 // 峰顶元素为符合条件的最靠近中心的元素值 public int peakIndexInMountainArray(int[] arr) { int n = arr.length; int l = 0, r = n - 2; while (l < r) { int mid = l r >> 1; if (arr[mid] > arr[mid 1]) r = mid; else l = mid 1; } return r; } }

class Solution { // 根据 arr[i-1] > arr[i] 在 [1,n-1] 范围内找值 // 峰顶元素为符合条件的最靠近中心的元素的前一个值 public int peakIndexInMountainArray(int[] arr) { int n = arr.length; int l = 1, r = n - 1; while (l < r) { int mid = l r >> 1; if (arr[mid - 1] > arr[mid]) r = mid; else l = mid 1; } return r - 1; } }

class Solution { // 根据 arr[i] < arr[i 1] 在 [0,n-2] 范围内找值 // 峰顶元素为符合条件的最靠近中心的元素的下一个值 public int peakIndexInMountainArray(int[] arr) { int n = arr.length; int l = 0, r = n - 2; while (l < r) { int mid = l r 1 >> 1; if (arr[mid] < arr[mid 1]) l = mid; else r = mid - 1; } return r 1; } }

换底公式推导图片,换底公式的推论及推导(3)

三分

事实上,我们还可以利用「三分」来解决这个问题。

顾名思义,「三分」就是使用两个端点将区间分成三份,然后通过每次否决三分之一的区间来逼近目标值。

换底公式推导图片,换底公式的推论及推导(4)

代码:

class Solution { public int peakIndexInMountainArray(int[] arr) { int n = arr.length; int l = 0, r = n - 1; while (l < r) { int m1 = l (r - l) / 3, m2 = r - (r - l) / 3; if (arr[m1] > arr[m2]) r = m2 - 1; else l = m1 1; } return r; } }

  • 时间复杂度:O(log3n)
  • 空间复杂度:O(1)
二分 & 三分 & k 分 ?

必须说明一点,「二分」和「三分」在渐进复杂度上都是一样的,都可以通过换底公式转化为可忽略的常数,因此两者的复杂度都是 O(logn)。

而选择「二分」还是「三分」取决于要解决的是什么问题:

  • 二分通常用来解决单调函数的找target 问题,但进一步深入我们发现只需要满足「二段性」就能使用「二分」来找分割点;
  • 三分则是解决单峰函数极值问题。

因此一般我们将「通过比较两个端点,每次否决 1/3 区间 来解决单峰最值问题」的做法称为「三分」;而不是简单根据单次循环内将区间分为多少份来判定是否为「三分」。

随手写了一段反例代码:

class Solution { public int peakIndexInMountainArray(int[] arr) { int left = 0, right = arr.length - 1; while(left < right) { int m1 = left (right - left) / 3; int m2 = right - (right - left 2) / 3; if (arr[m1] > arr[m1 1]) { right = m1; } else if (arr[m2] < arr[m2 1]) { left = m2 1; } else { left = m1; right = m2; } } return left; } }

这并不是「三分」做法,最多称为「变形二分」。本质还是利用「二段性」来做分割的,只不过同时 check 了两个端点而已。

如果这算「三分」的话,那么我能在一次循环里面划分 k−1 个端点来实现 k 分?

显然这是没有意义的,因为按照这种思路写出来的所谓的「四分」、「五分」、「k 分」是需要增加同等数量的分支判断的。这时候单次 while 决策就不能算作O(1) 了,而是需要在O(k) 的复杂度内决定在哪个分支,就跟上述代码有三个分支进行判断一样。

因此,这种写法只能算作是「变形二分」。

综上,只有「二分」和「三分」的概念,不存在所谓的k 分。 同时题解中的「三分」部分提供的做法就是标准的「三分」做法。

栏目热文

对数函数的换底公式(对数换底公式详细推导)

对数函数的换底公式(对数换底公式详细推导)

这两个例题很典型。对数的计算是一个蛮灵活的知识点。上面的结论可用于计算。,...

2022-11-07 05:27:06查看全文 >>

换底公式的五个推论及其证明(换底公式怎么证明的)

换底公式的五个推论及其证明(换底公式怎么证明的)

一、《集合与函数》内容子交并补集,还有幂指对函数。性质奇偶与增减,观察图象最明显。复合函数式出现,性质乘法法则辨,若要详...

2022-11-07 05:53:55查看全文 >>

高中数学换底公式(高中数学对数换底公式推导)

高中数学换底公式(高中数学对数换底公式推导)

一. 高一的部分同学通过两次考试之后,觉得跟不上老师的节奏了。比如说:学了对数以后,你可能还不知道对数是什么?对数的运算...

2022-11-07 05:42:25查看全文 >>

换底公式推导过程(换底公式怎么推导而来的)

换底公式推导过程(换底公式怎么推导而来的)

1.比较对数值大小常用的四种方法。(1)同底数的利用对数函数的单调性。(2)同真数的利用对数函数的图象或用换底公式转化。...

2022-11-07 05:57:28查看全文 >>

换底公式的推导证明(换底公式的五个推论的推导过程)

换底公式的推导证明(换底公式的五个推论的推导过程)

高中数学重难点及需补充的竞赛数学及大学数学知识文/刘蒋巍引言经历2021、2022年两年新高考后,我们发现:要想应对当下...

2022-11-07 05:49:25查看全文 >>

换底公式典型例题(经典对数题100道)

换底公式典型例题(经典对数题100道)

今天把指对数在高考选填中的考查形式做一次总结,指对数属于基本初等函数,浅一些可从指对数本身的运算考起,抑或结合函数性质考...

2022-11-07 06:05:55查看全文 >>

log公式大全图解(log对数公式大全图片)

log公式大全图解(log对数公式大全图片)

一图即可,就话不多说啦哈哈!记住公式,多练计算!,...

2022-11-07 05:56:14查看全文 >>

log换底公式(log和lg之间的换底公式)

log换底公式(log和lg之间的换底公式)

换底公式的运用 【总结升华】(1)利用换底公式可以把题目中不同底的对数化成同底的对数,进一步应用对数运算的性质....

2022-11-07 05:38:01查看全文 >>

国庆阅兵有哪些临沂人(大阅兵有没有临沂人)

国庆阅兵有哪些临沂人(大阅兵有没有临沂人)

国庆阅兵带来的震撼还未远去,咱临沂小伙杜子飞在国庆阅兵空军方队中亮相,亲身经历了这一光荣而神圣的时刻。1994年出生的杜...

2022-11-07 05:46:38查看全文 >>

文档排行