这道题。。一言难尽,看到的第一眼有个O(logn),我觉得一定是用二分法来做了,可是,这道题差点把我给整崩了,主要是要考虑得特别特别细,稍微一不注意就会到边界值出错。我,,大概做了5小时。。我的算法是真的不行。。还得练,我已经接连被两道题给打击了。。
这道题比常规的二分法查找难的地方就在于可能会在某个点进行旋转。min=0,max=len(nums)-1,做法是按照二分查找的做法来做,不过这里要注意的是判断target是在有序的里面还是在没序的里面,怎么判断呢? mid=(min+max)/2,如果mid>nums[max],说明mid后面的是无序的,因为原来的数组是升序排序,那么mid前的就肯定是有序的了。这个时候再来判断target在哪儿,假如tartget>nums[mid],那么target一定在mid的右边,因为左边是升序的,假如target比nums[max】小,那么target一定在mid右边,因为nums[max]<nums[mid],而nums[mid]>nums[min],只有当target<nums[mid] && target > nums[min]时,target在mid左边。同理,假如nums[mid]<nums[max],说明mid的右边一定是有序的,那么思路就和刚才一样了。这里需要格外注意的是有可能该数组并没有翻转,所以下面判断时是小于等于判断的。完整的代码如下: