
本题暴力法可以直接A,但是题目要求用log n的解法。 可以想到二分法,但是一般二分法适用于有序数组的,这里的数组只是部分有序,还能用二分法吗? 答案是可以的。因为数组是经过有序数组旋转得来的,所以在二分之后,左右两边必有一边是有序的。 具体细节看代码:
- class Solution {
- public:
- int search(vector<int>& nums, int target) {
- int left = 0;
- int right = nums.size()-1;
- while(left <= right)
- {
- int mid = (left + right) / 2;
- if(nums[mid] == target) return mid;
- //左半边升序的情况
- if(nums[0] <= nums[mid])
- {
- if(target < nums[mid] && target >= nums[0])
- {
- right = mid - 1;
- }
- else left = mid + 1;
- }
- //右半边升序的情况
- else
- {
- if(target > nums[mid] && target <= nums[nums.size()-1])
- {
- left = mid + 1;
- }
- else right = mid - 1;
- }
- }
- return -1;
- }
- };