Leetcode第33题目:搜索旋转排序数组
整数数组 nums 按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
求解思路:
这道题是利用二分搜索的变种来解题,题目的关键是要搞清楚二分搜索究竟应该如何使用。
二分搜索只能在nums数组的有序部分来使用,所以本题应该是根据mid位置来寻找target在左右两个子数组中的那一部分。由于只有一个旋转点,左右部分必然只有一部分是有序的,另一部分是无序的。
首先判断哪一部分是有序的,如果子数组的首尾两个元素是升序则有序,如果target在有序部分,则改变L-R使得下一次搜索有序部分,否则搜索无序部分。
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int size=nums.size();
int L=0,R=size-1,mid;
while(L<=R){
mid=(L+R)/2;
if(nums[mid]==target) return mid;
if (nums[mid]>=nums[L]) //左边有序
{
if(nums[L]<=target and target<=nums[mid] ){ //在左边
R=mid-1;
}
else{ //不在左边
L=mid+1;
}
}
else{ //右边有序
if(nums[mid]<=target and target<=nums[R]){ //在右边
L=mid+1;
}
else{ //不在右边
R=mid-1;
}
}
}
return -1;
}
};