标签:
题意:给一个旋转过的升序序列,比如[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;
}
};
leetcode 33 Search in Rotated Sorted Array
标签:
原文地址:http://www.cnblogs.com/Apro/p/5197806.html