题干: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
- 示例:
- eg1: 输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4
- eg2: 输入: nums =[4,5,6,7,0,1,2], target = 3 输出: -1
解题思路:
- 因为要求时间复杂读是O(log n),首先想到的是使用二分查找的方法
- 如何利用螺旋数组的特点:
一半有序,一半无序
?
- 判断目标值出现在有序的一半还是无序的一半
- 如果在有序的一半,则二分查找有序数组
- 如果在无序的一半,则在无序数组中重复前面的逻辑
样例代码:
public static void main(String[] args) {
int[] input = new int[] { 4, 5, 6, 7, 0, 1, 2 };
int target = 0;
int re = findPos(input, 0, input.length - 1, target);
System.out.println(re);
}
public static int findPos(int[] arr, int start, int end, int target) {
if (arr.length == 0 || start > end)
return -1;
int pivot = (start + end) >> 1;
if (target == arr[pivot])
return pivot;
if ((arr[start] < arr[pivot] && target >= arr[start]) || (arr[pivot] < arr[end] && target <= arr[end])) {
if (target < arr[pivot]) {
return findPos(arr, start, pivot - 1, target);
} else {
return findPos(arr, pivot + 1, end, target);
}
} else {
if (arr[start] > arr[pivot]) {
return findPos(arr, start, pivot - 1, target);
} else {
return findPos(arr, pivot + 1, end, target);
}
}
}