LeetCode33 搜索旋转排列数组
题目描述
给你一个升序排列的整数数组 nums
,和一个整数 target
。
假设按照升序排序的数组在预先未知的某个点上进行了旋转。(例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
)。
请你在数组中搜索 target
,如果数组中存在这个目标值,则返回它的索引,否则返回 -1
样例
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4
输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1
输入:nums = [1], target = 0
输出:-1
算法分析
- 二分找旋转点,中点与末端点是保持单调性质(
具体性质就是是否大于nums[0]
) - 确定是左还是右区间
>= nums[0]
左区间,<nums[0]
,右区间- 在区间内再次二分找
target
,找到返回左边,找不到返回-1
时间复杂度$O(log(n))$
Java代码
class Solution {
public int search(int[] nums, int target) {
if(nums.length == 0) return -1;
//
int l = 0, r = nums.length - 1;
while( l < r ){
int mid = l + r + 1 >> 1;
if(nums[mid] >= nums[0]) l = mid;
else r = mid - 1;
}
//找到左区间或者是右区间
if(target >= nums[0]) l = 0;
else{
l = r + 1;
r = nums.length - 1;
}
while(l < r){
int mid = l + r >> 1;
if(nums[mid] >= target ) r = mid;
else l = mid + 1;
}
if(nums[r] == target ) return r;
else return -1;
}
}