题意:给一个旋转过的升序序列,比如[0, 1, 2, 3, 4]可以旋转为[2, 3, 4, 0, 1],然后给一个目标数,求他在不在这个序列中。
解法:如果不旋转的话就是个普通的二分查找,但是旋转之后需要算index什么的好麻烦……旋转的偏移量也可用二分求,所以就是两次二分……对于我这个二分苦手来说就当练练二分了……
看了discuss有人说线性查找就过了……吐血……数据真弱……
代码:
class Solution { public: int search(vector<int>& nums, int target) { int ri = 0; //旋转的偏移量 int len = nums.size(); int l = 0, r = len - 1, mid; if(nums[0] > nums[len - 1]) { while(l <= r) { if(l == r) { ri = l; break; } mid = (l + r) >> 1; if(nums[mid + 1] > nums[r]) l = mid + 1; else if(nums[l] > nums[mid]) r = mid; else { ri = mid + 1; break; } } } l = 0, r = len - 1, mid; l = (l + ri) % len; r = (r + ri) % len; mid = (l + (r + len - l) % len / 2) % len; int cnt = 0; while(cnt < 100) { //这里的条件算起来好麻烦……所以就写了个计数器……反正不会超过log(INT_MAX)的…… if(nums[mid] == target) return mid; else if(nums[mid] > target) r = (mid + len - 1) % len; else if(nums[mid] < target) l = (mid + 1) % len; mid = (l + (r + len - l) % len / 2) % len; cnt++; } return -1; } };