這題是一道經典的二元搜尋應用題,結合了排序數列的特性與旋轉點的處理,考如何在這種變化下仍然保持高效搜尋的能力。
題目:
給定一個升序排序的整數陣列 nums
,但該陣列已經在某個未知的點上進行了旋轉(例如, [0,1,2,4,5,6,7]
可能變為 [4,5,6,7,0,1,2]
)。現在給定一個目標值 target
,如果 target
在陣列中,回傳它的索引;否則,回傳 -1
。
範例:
輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4
輸入: nums = [4,5,6,7,0,1,2], target = 3
輸出: -1
輸入: nums = [1], target = 0
輸出: -1
題目要求用 O(log n) 的時間複雜度演演算法來搜尋,直覺就是暗示用二元搜尋來實作搜尋,
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[left] <= nums[mid]) {
if (nums[left] <= target && target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else {
if (nums[mid] < target && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return -1;
}
};
參考:
#33. Search in Rotated Sorted Array