无重复递增数组从某个点开始把后面元素全部按原来的序移到前面,找target所在位置,没有则返回-1。二分,根据nums[mid]和nums[0]以及target和nums[mid]大小比较共有四种情况。先根据target和nums[0]分成两种不以mid所在位置决定的静态情况。分别对这两种情况套用lower_bound,考虑什么时候start 一定要前移到mid + 1:target >= nums[0]时,mid落在[nums[0], target);otherwise, mid落在[target, nums[0])外。
/*
* @lc app=leetcode id=33 lang=cpp
*
* [33] Search in Rotated Sorted Array
*/
// @lc code=start
class Solution {
public:
int search(vector<int>& nums, int target) {
if (nums.size() == 0) return -1;
int start = 0, end = nums.size() - 1;
while (start < end) {
int mid = start + (end - start) / 2;
if (target >= nums[0]) {
if (nums[mid] >= nums[0] && nums[mid] < target) start = mid + 1;
else end = mid;
} else {
if (!(nums[mid] < nums[0] && nums[mid] >= target)) start = mid + 1;
else end = mid;
}
}
return nums[start] == target ? start : -1;
}
};
// @lc code=end