Suppose a sorted array is rotated at some pivot unkonwn to you beforehand. (i.e.,0,1,2,4,5,6,7 might become 4 5 6 7 0 1 2).ios
You are given a target values to search.If found in the array return its index,otherwise return -1.You may assume no duplicate exists in the array.数组
这个题目是用二分法在旋转数组中查找目标值。 旋转数组旋转后,原来总体有序的数组如今变成了分段有序。旋转轴左边的数组是有序的,旋转轴右边的一样是有序的,而且均是单调递增。 不过再使用二分法查找,可能会有些不一样。旋转轴可能不在mid的位置上,因此可能first~mid这段或者是mid~last这段并非递增有序的。测试
可是,若是知足a[mid]>=a[1],则在1~mid这段的元素就是递增的;spa
知足a[mid]< a[last],则在mid~last这段就是递增的。code
解决方案:get
class Solution { public: int search(const vector<int> &num,int target) { int first = 0; int last = num.size(); while(first != last) { const int mid = first + (last - first)/2; if(num[mid] == target) return mid; if(num[first]<= num[mid]) { if(num[first] <= target && num[mid] > target) { last = mid; } else { first = mid + 1; } } else { if(num[mid] < target && num[last-1] >= target) { first = mid + 1; } else { last = mid; } } } return -1; } };
测试代码:it
#include<iostream> #include<vector> using namespace std; class Solution { public: int search(const vector<int>& num,int target) { int first = 0; int last = num.size(); while(first != last) { const int mid = first + (last - first)/2; if(num[mid] == target) return mid; if(num[first] <= num[mid]) { if(num[first] <= target && num[mid] > target) last = mid; else first = mid + 1; } else { if(num[mid]<= target && num[last] > target) first = mid + 1; else last = mid; } } return -1; } }; int main(void) { vector<int> a; int target = 1; a.push_back(4); a.push_back(5); a.push_back(6); a.push_back(7); a.push_back(1); a.push_back(2); a.push_back(3); Solution s; int result = s.search(a,target); cout <<"The"<<target<<"is located in "<<result<<endl; return 0; }