一类二分查找问题的学习与反思

原题陈述:

  1. leetcode-cn 第852题 - 山脉数组的峰顶索引
  2. leetcode-cn 第69题 - x的平方根

题型概括

1. 是一个有序序列

在852题中,对山脉数组的定义是一个先递增后递减的序列
在69题中,可以把待遍历 x 的取值认为是一个自然数递增序列

2. target值均不明确显示在题中,且不作为参数传入

在852题中,target 值是序列中的第一个最大数字
在69题中,target 值是 [ 0 : x ] 序列中最后一个小于等于 x \sqrt{x} x 的整数

题解分析

852题题解:找最大
class Solution:
    def peakIndexInMountainArray(self, arr: List[int]) -> int:
        res = 0
        lenth = len(arr)
        start = 0
        end = lenth
        while start <= end :
            mid = (end - start) // 2 + start
            if arr[mid] > arr[mid+1]:
                end = mid - 1
                res = mid
            else:
                start = mid + 1 
        return res
69题题解:找最小
class Solution:
    def mySqrt(self, x: int) -> int:
        if 0 < x <= 3: return 1
        elif x == 0:return 0
        left = 0
        right = x 
        while left <= right:
            mid = (right - left) // 2 + left
            if mid*mid <= x:
                left = mid + 1 
                ans = mid
            else:
                right = mid - 1 
        return ans

对比两题答案,可知,二分查找的骨架不变,均为:

left = 0
right = x 
while left <= right:
    mid = (right - left) // 2 + left
    if Condition:
    	...
    	res = mid
    else:
    	...
return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值