Leetcode - 33 Search in Rotated Sorted Array (Medium)
題目描述:給定一個旋轉的有序數組,例如有序數組 [0,1,2,4,5,6,7] 經一次旋轉後可得 [4,5,6,7,0,1,2] ,再給定一個 target 值,返回 target 值在數組中的下標,如果不在返回 -1,假設數組中無重複元素,時間複雜度要求爲 O(logn)。
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4
解題思路:題目要求時間複雜度是 O(logn) ,那就告訴我們要用二分搜索了,但是二分搜索是基於有序序列的,但是給出的數組經過一次旋轉之後就不再是有序的了,這時就要添加額外的判斷條件。
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0) return -1;
int lo = 0, hi = nums.length - 1;
while (hi > lo) {
int mid = (lo + hi) / 2;
if (nums[mid] == target) {
return mid;
}
// 一定有一邊是有序的
if (nums[mid] >= nums[lo]) {
// 如果不再有序的那一邊,就一定在另外一邊
if (target >= nums[lo] && target < nums[mid]) {
hi = mid - 1;
} else {
lo = mid + 1;
}
} else {
if (target > nums[mid] && target <= nums[hi]) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
}
return nums[lo] == target ? lo : -1;
}