Description:Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
Your algorithm’s runtime complexity must be in the order of O(log n).
Example 1:
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4
Example 2:
Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1
解題思路:題目的大概意思是,一個遞增序列(不含重複數據)切成2半,前一半放到後面去組成新的序列,該序列有個特點,只有在分界點上遞減,其他都是遞增的。現在給定一個目標,找出該目標所在的位置,找不到返回-1。因爲要求時間複雜度爲O(log n),所有得使用二分法,當前數組可以使用二分法。如果mid的數據等於target,則立即返回mid。如果left到mid的數據是連續遞增的,並且target在這個範圍內,則在該範圍內繼續使用二分法,如果不在該範圍內,則在mid到right使用二分法。如果left到mid數據不是連續遞增的,說明在mid到right是連續遞增的,如果target在mid到right範圍內,則繼續使用二分法,否則,在left到mid的範圍內使用二分法。最後都找不到的話,返回-1。
參考代碼:
int bin_search(int left, int right, vector<int> nums, int target) {
//遞歸用if
while (left <= right) {
int mid = (left + right) / 2;
if (target == nums[mid])
return mid;
if (nums[mid] >= nums[left] && target >= nums[left] && target < nums[mid]) {
//return bin_search(left, mid - 1, nums, target);
right = mid - 1;
}
else if (nums[mid] >= nums[left] && (target <= nums[left] || (target > nums[mid]))) {
//return bin_search(mid + 1, right, nums, target);
left = mid + 1;
}
else if (nums[mid] <= nums[left] && (target > nums[mid]) && target <= nums[right]) {
//return bin_search(mid + 1, right, nums, target);
left = mid + 1;
}
else {
//return bin_search(left, mid-1, nums, target);
right = mid - 1;
}
}
return -1;
}
int MySolution::search(vector<int>& nums, int target) {
return bin_search(0, nums.size() - 1, nums, target);
}
總結:最後發現遞歸和循環效率相差很大,這裏給出測試結果
使用循環二分查找:
Runtime: 4 ms, faster than 81.73% of C++ online submissions for Search in Rotated Sorted Array.
Memory Usage: 8.9 MB, less than 43.37% of C++ online submissions for Search in Rotated Sorted Array.
使用遞歸二分查找:
Runtime: 8 ms, faster than 15.65% of C++ online submissions for Search in Rotated Sorted Array.
Memory Usage: 10.7 MB, less than 6.03% of C++ online submissions for Search in Rotated Sorted Array.