已序数组旋转后找target
题目: 旋转后的已序数组【4 6 8 9 0 2 3】找target
思路
因为是已序后旋转,所以是一个类似已序的数组,在里面找target,肯定是二分查找了
但是要注意很多细节
方法1
情况1:
4 6 8 9 0 2 3
^ ^ ^
f mid l
^
target
arr[first] <= target && target < arr[mid]
情况2:
4 6 8 9 0 2 3
^ ^ ^
f mid l
^
target
arr[first] <= target && target > arr[mid] && arr[first] > arr[mid]
情况3:
4 6 8 9 0 2 3
^ ^ ^
f mid l
^
target
arr[first] > target && target < arr[mid] && arr[first] > arr[mid]
code
// 4 5 6 7 0 1 2 3
public class Search{
public static void main(String args[]){
int[] arr = {
5,6,7,9,0,1,2,3};
System.out.println(search(arr,9));
System.out.println(search(arr,5));
System.out.println(search(arr,6));
System.out.println(search(arr,7));
System.out.println(search(arr,0));
System.out.println(search(arr,1));
System.out.println(search(arr,2));
System.out.println(search(arr,3));
System.out.println(search(arr,4));
System.out.println(search(arr,8));
System.out.println(search(arr,-9));
System.out.println("==================");
}
public static int search(int[] arr, int target){
if(arr == null){
return -1;
}
int first = 0;
int last = arr.length - 1;
while(first <= last){
int mid = first + (last - first) / 2;
if(arr[mid] == target){
return mid;
}else if((arr[first] <= target && target < arr[mid])
|| (arr[first] <= target && target > arr[mid] && arr[first] > arr[mid])
|| (arr[first] > target && target < arr[mid] && arr[first] > arr[mid])){
last = mid - 1;
}else{
first = mid + 1;
}
}
return -1;
}
}
方法2
其实不论mid在哪里,一定都有一边是有序的
4 6 8 9 0 2 3
^ ^ ^
f mid l
已序
f - mid
4 6 8 9 0 2 3
^ ^ ^
f mid l
已序
mid - l
// 4 5 6 7 0 1 2 3
public class Search{
public static void main(String args[]){
int[] arr = {
5,6,7,9,0,1,2,3};
System.out.println(search2(arr,9));
System.out.println(search2(arr,5));
System.out.println(search2(arr,6));
System.out.println(search2(arr,7));
System.out.println(search2(arr,0));
System.out.println(search2(arr,1));
System.out.println(search2(arr,2));
System.out.println(search2(arr,3));
System.out.println(search2(arr,4));
System.out.println(search2(arr,8));
System.out.println(search2(arr,-9));
}
public static int search2(int[] arr, int target){
if(arr == null){
return -1;
}
int first = 0;
int last = arr.length - 1;
while(first <= last){
int mid = first + (last - first) / 2;
if(arr[mid] == target){
return mid;
}else{
if(arr[mid] > arr[first]){
//前面有序
if(arr[mid] > target && arr[first] <= target){
last = mid - 1;
}else{
first = mid + 1;
}
}else{
//后面有序
if(arr[mid] < target && arr[last] >= target){
first = mid + 1;
}else{
last = mid - 1;
}
}
}
}
return -1;
}
}