算法描述:
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 become4 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.
Subscribe to see which companies asked this question.
题目来自此处
解法:
一开始以为题意是找旋转的那个标志位(误)
既然是寻找,那么最小的时间复杂度是
O(logn)
。用了
O(n)
的算法即相当于直接查找……
那么只能用二分查找才能保证最快的查找速度,但是二分查找是建立在有序表的基础上的,怎么操作呢?
先“二分查找”出数组进行旋转的标志位,标志位两边分别是数组的最大、最小值,根据这个再对数组进行分别“二分查找”处理就好了~
class Solution {
public:
int search(vector<int>& nums, int target) {
int size = nums.size();
if (size==0) return -1;
int low = 0, high = size - 1;
while (low < high){
int mid = (low + high) / 2;
if (nums[mid] > nums[high]) //表明当前mid到high之间不按升序排列
low = mid + 1;
else
high = mid;
}//找出标志位(最小值)
int flag = low;
if (target >= nums[flag] && target <= nums[size - 1])
return bin_method(nums, flag, size - 1,target);
else if (target >= nums[0] && target <= nums[flag-1])
return bin_method(nums, 0, flag-1,target);
else
return -1;
}
int bin_method(vector<int> num, int low, int high,int target){
if (num[low] == target)
return low;
else if (num[high] == target)
return high;
else{
while (low < high){
int mid = (low + high) / 2;
if (num[mid] == target)
return mid;
else if (num[mid] > target)
high = mid;
else
low = mid+1;
}
return -1;
}
}
};
当然可把数组的旋转部分当做原数组的扩展进行处理,就不用分步讨论,代码可以大大缩短~
最后吐槽下md写公式的预览效果跟发表博客之后的效果大相径庭。。