题意:给一个旋转数组和一个目标值target,求用O(logn)时间在数组中找出target值
思路:首先用二分找到旋转后的开始索引,之后根据目标值和两个子数组大小关系在子数组中再用二分即可。注意找开始索引和找目标值用的二分方法不同
class Solution {
public int search(int[] nums, int target) {
if (nums.length == 0)
return -1;
int l = 0, r = nums.length-1, index = -1;
while (l < r) {
int mid = (l+r)>>1;
if (nums[mid] > nums[r]) {
l = mid + 1;
} else {
r = mid;
}
}
index = l;
if (nums[index] <= target && nums[nums.length-1] >= target) {
l = index;r = nums.length-1;
while (l <= r) {
int mid = (l+r)>>1;
if (nums[mid] > target) {
r = mid - 1;
} else {
l = mid + 1;
}
}
} else {
l = 0;r = index - 1;
while (l <= r) {
int mid = (l+r)>>1;
if (nums[mid] > target) {
r = mid - 1;
} else {
l = mid + 1;
}
}
}
if (l >= 0 && l < nums.length && nums[l] == target) {
return l;
} else if (r >= 0 && r < nums.length && nums[r] == target) {
return r;
} else {
return -1;
}
}
}