- 题目描述
升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] )。请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
来源:LeetCode
- 示例
- 示例 1:
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4 - 示例 2:
输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1 - 示例 3:
输入:nums = [1], target = 0
输出:-1
- 思路分析
旋转后的数组是部分有序的,因此考虑到将二分查找稍微变一下使用。二分查找是将数组一分为二,旋转排序数组一份为二后,一定有一半是有序的。如果 t a r g e t target target在有序的那一半,则直接二分查找即可。如果在无序的那一半,则继续二分。
- JAVA实现
public int search(int[] nums, int target) {
int len=nums.length;
if(len==0) return -1;
int start=0, end=len-1;
while(start<=end) {
int mid = (start+end)/2;
if(nums[mid] == target) return mid;
else if(nums[start]<=nums[mid]) { //first half in order
if(target>=nums[start] && target<nums[mid]) end = mid-1;
else start = mid+1;
}
else { //last half in order
if(target>nums[mid]&& target<=nums[end]) start = mid+1;
else end = mid-1;
}
}
return -1;
}