题目内容:
Suppose a sorted array 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.
说明:
1,这个题目是在数组中查找目标元素,最坏的时间复杂度都是O(n)的,最差就是从头到尾的查找一遍。这个也是可以通过的。2,好一点的思路,因为是有序的数组,关键在于扭转点的发现。使用二叉查找的思路,复杂度是O(logn)。
注意:有序或基本有序的数组的查找问题,都应该想到二叉查找。
第一种思路的代码:(略傻)
class Solution {
public:
int search(int A[], int n, int target) {
int i = 0;
for(; i < n; i++)
{
if( target == A[i] )
return i;
}
if(i==n)
return -1;
}
};
第二种思路的代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int size = nums.size();
if(size <= 0)
return size;
int left = 0;
int right = size - 1;
int middle = (left + right) / 2;
if(nums[middle] == target)
return middle;
else if(nums[middle] < nums[right])
{
if((target > nums[middle]) && (target <= nums[right]) )
{
return BinarySearch(nums,middle + 1,right,target);
}
else
{
return SearchRotate(nums,left,middle - 1,target);
}
}
else
{
if((target >= nums[left]) && (target < nums[middle]) )
{
return BinarySearch(nums,left,middle - 1,target);
}
else
{
return SearchRotate(nums,middle + 1,right,target);
}
}
}
int BinarySearch(vector<int>& nums,int left,int right,int target)
<span style="font-family: Arial, Helvetica, sans-serif;">//在单调有序的数组中查找目标元素,二叉查找</span>
{
if(left > right)
return -1;
int middle = (left + right) / 2;
if(nums[middle] == target)
return middle;
else if(nums[middle] > target)
{
return BinarySearch(nums,left,middle - 1,target);
}
else
{
return BinarySearch(nums,middle + 1,right,target);
}
}
int SearchRotate(vector<int>& nums,int left,int right,int target) //在回旋数组中查找目标元素
{
if(left > right)
return -1;
int middle = (left + right) / 2;
if(nums[middle] == target)
return middle;
else if(nums[middle] < nums[right])
{
if((target > nums[middle]) && (target <= nums[right]) )
{
return BinarySearch(nums,middle + 1,right,target);
}
else
{
return SearchRotate(nums,left,middle - 1,target);
}
}
else
{
if((target >= nums[left]) && (target < nums[middle]) )
{
return BinarySearch(nums,left,middle - 1,target);
}
else
{
return SearchRotate(nums,middle + 1,right,target);
}
}
}
};