leetcode33搜索旋转排序数组
要求:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
例如:4,5,6,7,8,1,2,3 搜索7
输出:3
解法:这道题是中等难度的题目,评测的不错,缺失难度还差不多,就是一道二分查找的升级版。
旋转数组有两种类型:
一种是左边有序的多一点,例如 2 3 4 5 6 7 1
还一种是是右边有序的多一点,例如 7 1 2 3 4 5 6
对于第一种情况,我们定义low=0,high=6,mid=(low+high)/2=3
搜索1试试,1<5&&1<2,,所以1肯定不在左边,low=mid+1=4,high=6,mid=5
1<7&&1<6,所以1肯定不在左边,low = mid+1=6,high=6,mid=6
1=nums[6]return 6;
再搜索3试试
3<5&&3>2,所以3肯定在左边,high=mid-1=2,low=0,mid=1
3=nums[1]return 1;
第二种情况差不多,自己试下吧
public int search(int[] nums, int target) {
if(null==nums||nums.length==0)
return -1;
int low = 0;
int high = nums.length-1;
while(low<=high) {
int mid = (low + high) >>> 1;
//左边有序的多 2 3 4 5 6 7 1
if(nums[mid]>=nums[high]){
if (target == nums[mid]) {
return mid;
} else if (target >= nums[low] && target < nums[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}else{ //右边有序的多 7 1 2 3 4 5 6
if (target == nums[mid]) {
return mid;
} else if (target <= nums[high] && target > nums[mid]) {
low = mid + 1;
} else {
high = mid - 1;
}
}
}
return -1;
}