题目:
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e.,0 1 2 4 5 6 7might become4 5 6 7 0 1 2).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
题意:
假设一个排序后的数组在某个未知的轴上旋转。
(即,0 1 2 4 5 6 7 可能变成:4 5 6 7 0 1 2)
给定要搜索的目标值,如果在数组中找到,返回它的索引,否则返回-1。
您可以假设数组中不存在副本。
解决思路:
暴力搜索法,直接进行比较取索引就行
/*
* 暴力搜索法
*/
public static int search2(int[] A, int target) {
if(A == null || A.length <= 0) {
return -1;
}
int index = 0;
for(int i = 0 ;i < A.length ;i++) {
if(A[i] == target) {
index = i;
}
}
return index;
}
下面是折半查找的方法
因为这里发生的旋转,所以数组的序列发生了改变,但中点是不会变的,也就是我们找出左右两边是从小到大还是从大到小就可以解决问题。那我们怎么判断是从小到大,还是从大到小呢,这里可以取中点和旁边的数字比较大小就可以得出两边的序列是升序还是降序了。所以所以我们可以分为3种情况讨论:
第一种是 直接命中的,我们直接返回mid就行
第二种是A[mid] < A[high] 表明 这个 mid-high是升序的,既然是升序的,那我们可以判断目标值是否在A[mid]-A[high]里面,是就low = mid +1,不是就high = mid -1;这里就和折半的思路是差不多的
第三种也就是A[mid] > A[high],表明这个mid - low是降序的,也就是low-mid有序。那我们可以判断目标值是否在A[low]-A[mid]里面,在high = mid -1;不在 low = mid -1;
Java代码表示:
public static int search(int[] A, int target) {
if(A == null || A.length <= 0) {
return -1;
}
int low = 0;
int high = A.length-1;
while(low <= high) {
int mid = (low + high)/2;
//在中间的情况
if(A[mid] == target) {
return mid;
}
//mid-high为升序状态
if(A[mid] < A[high]) {
if(target > A[mid] && target <= A[high]) {
low = mid + 1;
}
else {
high = mid -1;
}
}
//low - mid是有序的
else {
if(target >= A[low] && target < A[mid] ) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
}
return -1;
}