難度中等581收藏分享切換爲英文關注反饋
假設按照升序排序的數組在預先未知的某個點上進行了旋轉。
( 例如,數組 [0,1,2,4,5,6,7]
可能變爲 [4,5,6,7,0,1,2]
)。
搜索一個給定的目標值,如果數組中存在這個目標值,則返回它的索引,否則返回 -1
。
你可以假設數組中不存在重複的元素。
你的算法時間複雜度必須是 O(log n) 級別。
示例 1:
輸入: nums = [4,5,6,7,0,1,2]
, target = 0
輸出: 4
示例 2:
輸入: nums = [4,5,6,7,0,1,2]
, target = 3
輸出: -1
class Solution {
public:
int search(vector<int>& nums, int target) {
int size = nums.size();
if (size ==0){
return -1; //在這裏進行一下邊界條件的判斷
}
int left =0;
int right = size -1;//注意這裏不要在訪問的時候越界了喲
while (left <=right){
int mid =left + ( -left +right) /2;
if(nums[mid] == target){
return mid;
}
//在這裏的一個解題思路爲 將這麼一串數據分爲兩個部分,那肯定是有一部分數據是有序的,另一部分是無序的
if(nums[left] <=nums[mid]) {//如果左邊是有序的
if(nums[left] <=target && target <=nums[mid]){ //目標在左半邊,一定要注意這裏中間值的判斷
right = mid -1; //nums[left],target,nums[mid] 三個數的大小
} else{
left = mid +1;
}
} else{ //如果數據的右邊是有序排列的那麼
if(nums[mid] <=target && target <=nums[right]){//目標在右半邊
left = mid +1;
}else{
right = mid -1;
}
}
}
return -1; //如果沒有找到的話,返回 -1
//加油加油, Try to make yourself more excellent.
}
};