一、题目
二、解答
1.心路历程:题目要求“你必须设计并实现时间复杂度为 O(log(n))
的解决方案”,在此处我想到了二分+指针的方法来解决这道题。但是题目要求返回索引,如何协调二分列表中的索引和返回的索引成了问题。
2.学习参考力扣作者宫水三叶代码(. - 力扣(LeetCode)),写出如下代码。此处使用首尾双指针解决索引问题。
class Solution:
def peakIndexInMountainArray(self, arr: List[int]) -> int:
# 二分法 + 指针
n = len(arr)
# 此处首尾指针很妙
l,r = 1,n-1 #根据 arr[i-1] < arr[i] 在 [1,n-1] 范围内找值
while l < r:
mid = l + r + 1 >> 1 # +1:当l,r临近时避免死循环
if arr[mid - 1] < arr[mid]:
l = mid
else:
r = mid - 1
return r
3.另外宫水三叶还提供了三分法解决这道题,下面来学习一下:
class Solution:
def peakIndexInMountainArray(self, arr: List[int]) -> int:
# 三分法
n = len(arr)
l,r = 0,n-1
while l < r:
m1,m2 = l+(r-l)//3, r-(r-l)//3
if arr[m1] < arr[m2]:
l = m1 + 1 #因为是最大值,所以不可能是m1
elif arr[m1] > arr[m2]:
r = m2 - 1
else:
l = m1 + 1
r = m2 - 1
return r
三、收获与不足
1.学习二分法、三分法+指针的用法。
2.在2.2代码中mid = l + r + 1 >> 1这里+1不是很理解,暂时留在这里,后面懂了再记录。
感谢你看到这里!一起加油吧!