本题的整体思路为二分搜索法。
整体思路如下:
(1)从nums的左右两边同时遍历,寻找出断点的位置,赋初值i=0、j=len-1。
方法:若nums[i]>nums[i+1],表示i为转折的断点,i左边、右边各按照升序排序;
若nums[j] 一旦找到断点,则退出循环。并用min记录右半部分第一个位置(即数组中最小数值的位置),用max记录左半部分最后一个位置(即数组中最大数值的位置)。 (2)先将显而易见无法在数组中找到位置的数值情况返回-1,即target小于最小值或大于最大值、target小于左半部分最小值或大于右半部分最大值。 (3)再继续缩小范围:若比右半部分的最大值要小,因此属于右半部分,将max指针赋值为最后一个位置;若比左半部分的最小值要大,因此属于左半部分,将min赋值为0。 此时min到max中的数值为全部升序的顺序,可以按照正常二分搜索。 (4)定义for循环,定义mid指针为min+(max-min)/2,因为int类型,不需要考虑小数的出现,无论max-min数值为奇数还是偶数,mid均为中间位置指针。循环条件为min<=max。 当nums[mid]=target时直接返回mid;当nums[mid] 若nums[min]>target或者nums[max] (5)若循环结束后还未找到target,则直接返回-1,表示无法找到。class Solution {
public:
int search(vector



