题目:搜索旋转排序数组
一开始的想法是:先遍历一遍旋转后的数组,分别找到两个各自单调的子数组,之后对这两个数组分别进行二分查找;但这会导致线性的时间复杂度,而不是题目要求的logn
而下面这种方法就是不通过遍历,直接在二分查找中对有序的子数组进行判断
具体实现:
仍然是先定义左右边界(左闭右开),之后进入循环
当mid对应的值恰好与target相等时,则mid就是我们要找的下标
若是不等,则根据当前中点值与最右值得比较结果,对左数组与右数组进行选择
之后再在这两个子数组中进行二分查找
1int search(vector<int>& nums, int target)
2{
3 int left = 0, right = nums.size() - 1;
4 while(left <= right)
5 {
6 int mid = left + (right - left) / 2;
7 if(nums[mid] == target)
8 return mid;
9 else if(nums[left] <= nums[mid])
10 {
11 // 进入左数组
12 if(nums[left] <= target && target < nums[mid])
13 right = mid;
14 else
15 left = mid + 1;
16 }
17 else
18 {
19 //进入右数组
20 if(nums[mid] < target && target <= nums[right])
21 left = mid + 1;
22 else
23 right = mid;
24 }
25 }
26 return -1;
27}