LeetCode-033-搜索旋转排序数组
1. 题目:
搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
)。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1
。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
示例 1:
1 | 输入: nums = [4,5,6,7,0,1,2], target = 0 |
示例 2:
1 | 输入: nums = [4,5,6,7,0,1,2], target = 3 |
2. 解题:
一个升序数组被旋转后其实是变成两个升序数组,所以我们可以使用二分法查找。总体思路有两步:
a) 找到旋转点,也就是最小的点min
,使用二分法查找。
b) 通过旋转点将数组分为两个升序数组,分别使用二分法查找。
代码:
1 | class Solution { |
3. 注意:
我们需要注意一点:<<, >>, >>>
的优先级低于+, -
。
因此我们用位运算来计算除以2的运算需要写成left + ((right - left) >>> 1)
不能写成left + (right - left) >>> 1
。