题目链接:https://leetcode.com/problems/search-in-rotated-sorted-array/description/
题目的意思是本来一个数组是升序排列的,现在可能以某一个数为结点进行了翻转,也有可能没有。题目是二分查找的变体,但因为有rotate的存在,当切取一半的时候可能会出现误区,需要我们自行判断,数组nums[],左边缘为l,右边缘为r,还有中间点为m,在每次迭代中,分三种情况讨论。
(1)如果target==nums[m],那么m就是我们要的结果,直接返回;
(2)如果nums[m]<nums[r],那么说明从m到r一定是有序的(没有受到rotate的影响),那么我们只需要判断target是不是在m到r之间,如果是则把左边缘移到m+1,否则就target在另一半,即把右边缘移到m-1。
(3)如果nums[m]>=nums[r],那么说明从l到m一定是有序的,同样只需要判断target是否在这个范围内,相应的移动边缘即可。
根据以上方法,每次我们都可以切掉一半的数据,所以算法的时间复杂度是O(logn),空间复杂度是O(1)。代码如下:
int search(vector<int>& nums, int target) {
if(nums.empty()) return -1;
int l=0,r=nums.size()-1;
while(l<=r){
int m=(l+r)/2;
if(target==nums[m]) return m;
if(nums[m]<nums[r])
{
if(target>nums[m]&&target<=nums[r])
l=m+1;
else
r=m-1;
}
else
{
if(target>=nums[l]&&target<nums[m])
r=m-1;
else
l=m+1;
}
}
return -1;
}