搜索旋转排序数组
题目链接:搜索旋转排序数组
思路:
- 该题目是二叉搜索的变形,变化就是,将一个有序数组,从一个未知节点折断放到末尾
- 这里处理方式还是相同的,找到mid位置,判断该数是否与目标值相同,如果相同return
- 不同就与当前范围的第一个数比较,如果不小于,则说明该数前面的数字是有序的,再判断target是否在该范围内,不在就转到后面
- 如果小于,则说明前面的数中,包含折断位置,那么该数后面的数一定是有序的,即判断是否在后面的范围内,不在则往前找。
public static int search(int[] nums, int target) {
return search(nums,0,nums.length-1,target);
}
public static int search(int[] nums,int first,int last,int target) {
while(first<=last) {
int mid = first + ((last-first)>>1);
if(nums[mid]==target) {
return mid;
}
if(nums[mid]>=nums[first]) {
//前面是有序的
if(target>=nums[first]&&target<nums[mid]) {
//在前面搜索即可
last = mid-1;
}else {
first = mid+1;
}
}else {
//后面是有序的
if(target>nums[mid]&&target<=nums[last]) {
first = mid+1;
}else {
last = mid-1;
}
}
}
return -1;
}