LeetCode搜索螺旋排序数组
题干:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
示例:
eg1:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
eg2:
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1
思路:
使用二分法,将数组分为两部分,一部分为无序数组,一部分为有序数组
1.首先判断目标在无序段还是在有序段
2.如果目标在有序段,则直接使用二分查找
3.如果目标在无序段,则将左端点/右端点移近,并重新计算mid,将无序段划分为子有序段和子无序段
4.重复1-3,直到找到目标值或是左端点大于右端点退出
代码:
int search(vector<int>& nums, int target) {
int le=0;
int ri=nums.size()-1;
int mid=(le+ri)>>1;
//二分查找,总有一段是有序的,先在有序段中查找。如果有序段中没有,则将无序段再次划分为有序段和无序段进行查找
while(le<=ri)
{
if(nums[mid]==target)return mid;
if((nums[mid]>nums[le]&&target>=nums[le])||(nums[mid]<nums[ri]&&nums[ri]>=target)){
//有序
if(target<nums[mid]){
ri=mid-1;
}
else{
le=mid+1;
}
mid=(ri+le)>>1;
}else{
//无序
if(nums[mid]<nums[le])//左无序
ri=mid-1;
else//右无序
le=mid+1;
mid=(le+ri)>>1;
}
}
return -1;
}