标签:
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.
Array Binary Search
这道题需要查找一个特殊的顺序表,这是一个正常的顺序表某个地方发生了一个旋转,再查找,还是使用二分查找,只不过其中需要注意一些问题。
#include<iostream>
#include<vector>
using namespace std;
//正常顺序的查找
int searched(vector<int>& nums,int target,int i,int j)
{
if(i+1==j)
{
if(target==nums[i])
return i;
if(target==nums[j])
return j;
return -1;
}
if(i==j)
{
if(target!=nums[i])
return -1;
else
return i;
}
if(target<nums[i]||target>nums[j])
return -1;
int k=(i+j)/2;
while(1)
{
if(target==nums[k])
return k;
if(target>nums[k])
i=k;
else
j=k;
if(i+1==j)
{
if(target==nums[i])
return i;
if(target==nums[j])
return j;
return -1;
}
if(i==j)
{
if(target==nums[i])
return i;
else
return -1;
}
k=(i+j)/2;
}
}
//中间不知哪里发生旋转而产生的查找
int search(vector<int>& nums, int target) {
int len=nums.size();
int i=0;
int j=len-1;
while(1)
{
if(i+1==j)
{
if(target==nums[i])
return i;
if(target==nums[j])
return j;
return -1;
}
if(i==j)
{
if(nums[i]==target)
return i;
else
return -1;
}
if(nums[i]<=nums[j])
return searched(nums,target,i,j);
int k=(i+j)/2;
if(target==nums[k])
return k;
if(nums[i]<=nums[k])
{
int last=searched(nums,target,i,k);
if(last!=-1)
{return last;}
i=k;
}
if(nums[k]<=nums[j])
{
int last=searched(nums,target,k,j);
if(last!=-1)
return last;
j=k;
}
}
}
int main()
{
vector<int> vec;
vec.push_back(4);vec.push_back(5);vec.push_back(6);vec.push_back(7);vec.push_back(0);vec.push_back(1);
vec.push_back(2);
cout<<searched(vec,2,4,6)<<endl;
cout<<search(vec,2)<<endl;
}
leetcode_33题——Search in Rotated Sorted Array(二分查找)
标签:
原文地址:http://www.cnblogs.com/yanliang12138/p/4592999.html