2024.3.5做题记录-力扣852. 山脉数组的峰顶索引

本文介绍了如何使用二分法和指针技巧解决LeetCode上的山形数组峰顶索引问题,以及通过宫水三叶的示例代码学习了两种方法。作者通过实际操作加深了对二分+1的理解,并分享了学习过程中的收获和疑问。
摘要由CSDN通过智能技术生成

一、题目

https://leetcode.cn/problems/peak-index-in-a-mountain-array/?envType=study-plan-v2&envId=primers-list

二、解答

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不是很理解,暂时留在这里,后面懂了再记录。

感谢你看到这里!一起加油吧!

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值