二分搜索(2)

案例1
这里写图片描述
本题可用二分搜索来实现,时间复杂度O(logN)
1.arr为空或长度为0,返回-1,表示局部最小值不存在。
2.arr为空或长度为1,返回0,因为此时0是局部最小位置。
3.arr长度大于1
(1)首先检查两头的位置
这里写图片描述
若两头位置都不是局部最小位置,说明趋势为
这里写图片描述
此时可以看mid。
若mid左右相比最小,局部最小,返回。
若mid比右小,比左大
这里写图片描述
可以对左部分进行二分搜索
同理,若mid比右小,比左大,可以对右部分进行二分搜索
若mid比左右都大,可以对两边都进行二分搜索。

案例2
给定一个有序数组arr,再给定一个整数num,请在arr中找到num这个数出现的最左边的位置。
res用来记录最后一次找到num的位置,初始为-1.若结束仍未-1,说明没找到。
第一步:
这里写图片描述
第二步:
这里写图片描述
第三步:
这里写图片描述
第四步:
这里写图片描述

案例3
给定一个有序循环数组arr,返回arr中最小值。有序循环数组是指,有序数组左边任意长度的部分放到右边去,右边的部分拿到左边来。
解:
这里写图片描述
若成立,说明这段数组有序。

若arr[L]>arr[R],继续分析M
若arr[L]>arr[M],说明最小值只有可能出现在L到M的范围内
继续在左部分进行二分搜索。
若arr[M]>arr[R],说明最小值只有可能出现在M到R的范围内
继续在右部分进行二分搜索。
若arr[L]>=arr[R]且arr[L]<=arr[M]且arr[M]<=arr[R]
得出:
arr[L]=arr[M]=arr[R]
此时无法二分搜索,只能遍历。
例:222122222222

案例4
给定一个有序循环数组arr,其不含重复元素,请找到满足arr[i]==i的最左位置。若所有位置上的数都不满足,返回-1。
解:
这里写图片描述
若上述情况都没发生,考察中间数M的情况。
若arr[M]>M,在M左边继续二分
若arr[M]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值