Search in Rotated Sorted Array
解题思路
首先注意题目要求,算法时间复杂度要求为:O(log n),那么很容易想到的算法就是二分查找,没错,这个题就是二分查找算法的变形。
二分查找算法过程描述大概如下(wiki):是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
而此题不同之处就在于,有序数组被进行过一次翻转,所以在搜索过程中,target在数组中区间范围的确定不能简单根据target与中间元素的大小比较来确定,确定大体流程如下:
约定:当前数组范围:[l,h]
mid = (l+h)/2 //中间元素索引下标
代码(c++)
class Solution {
public:
int search(vector<int>& nums, int target) {
int siz = nums.size();
int l = 0, h = siz-1;
while(l <= h) {
int mid = (l + h) / 2;
if(nums[mid] == target) return mid;
else if(nums[mid] > target) {
if(nums[h] < nums[mid] && nums[l] > target) l = mid + 1;
else h = mid - 1;
} else {
if(nums[h] < target && nums[h] > nums[mid]) h = mid - 1;
else l = mid + 1;
}
}
return -1;
}
};