• 二分查找——山峰数组系列(leetcode 852, 剑指 Offer II 069)


    """
    leetcode 852. 山脉数组的峰顶索引 剑指 Offer II 069. 山峰数组的顶部
    符合下列属性的数组 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

    提示:
    3 <= arr.length <= 104
    0 <= arr[i] <= 106
    题目数据保证 arr 是一个山脉数组

    解题思路:
    山脉数组也就是先递增后递减的数组,这道题可以转换成求解数组中最大值的索引,需要考虑两种情况:
    1)数组全部升序;2)数组全部倒序;当数组全部降序的时候mid=0;当数组全部升序时,mid = len(arr) - 1
    """
    class Solution(object):
    def peakIndexInMountainArray(self, arr):
    left = 0
    right = len(arr)
    while left < right:
    mid = left + int((right - left) / 2)
    # 针对越界情况进行判断(全部是递增 或者 全部递减)
    if mid + 1 >= len(arr) or mid - 1 < 0:
    return mid
    if arr[mid] > arr[mid + 1] and arr[mid] > arr[mid - 1]:
    return mid
    if arr[mid] > arr[mid - 1]:
    left = mid + 1
    if arr[mid] > arr[mid + 1]:
    right = mid

    if __name__ == "__main__":
    arr = [0,2,1,0]
    solution = Solution()
    res = solution.peakIndexInMountainArray2(arr)
    print(res)
  • 相关阅读:
    XML节点处理
    Log4Net使用记录
    WPF选择文件夹及文件操作
    SQL 一些语句记录
    一篇MSSQL事务的测试文章
    游标示例
    WPF实现多线程加载数据
    MS SQL索引学习
    Entity Framework 利用 Database.SqlQuery<T> 执行存储过程,并返回Output参数值
    手持移动端特殊链接:打电话,发短信,发邮件
  • 原文地址:https://www.cnblogs.com/tomorrow-hope/p/15476475.html
Copyright © 2020-2023  润新知