題幹: 假設按照升序排序的數組在預先未知的某個點上進行了旋轉。
( 例如,數組 [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);
}
}
}