題目描述
假設按照升序排序的數組在預先未知的某個點上進行了旋轉。
( 例如,數組 [0,1,2,4,5,6,7] 可能變爲 [4,5,6,7,0,1,2] )。
搜索一個給定的目標值,如果數組中存在這個目標值,則返回它的索引,否則返回 -1 。
你可以假設數組中不存在重複的元素。
你的算法時間複雜度必須是 O(log n) 級別。
思路分析
時間複雜度logn,加上部分有序用二分。
- 兩次二分。一次找所在區間,一次在區間裏找到元素。
- 一次二分。根據旋轉後的數組性質,nums[mid] < nums[right]則右半邊是有序的,反之左半邊有序。繼續用數組的左和右的元素進行判斷縮小區間。
代碼實現
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] < nums[right]) {
if (target > nums[mid] && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
} else if (nums[mid] > nums[right]) {
//判斷target在左在右
//target在右
if (target < nums[mid] && target >= nums[left]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return -1;
}