class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @param target int整型
* @return int整型
*/
/*
二分法
start end mid
while(start < end) {
if (start < mid ) { // start 到mid是单调递增的
if (target < mid) {
target就在start和mid之间
right = mid;
} else {
target在 mid之后
left = mid;
}
} else {
if (target > right) {
在mid左面。
right = mid;
} else {
在mid右面
left = mid;
}
}
}
*/
int search(vector<int>& nums, int target) {
int len = nums.size();
if (len == 0) {
return -1;
}
int left = 0, right = len - 1;
while(left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[left] <= nums[mid] ) {
/*
mid +1还是-1要注意的问题,如果target在当前mid的左面,要考虑[mid]和target的关系,
if(target == mid) {
right = mid;
}
但是这个上面已经做过约束了,所以要考虑left和targt的关系,也就是说,left是有可能等于target,
所以
[left] <= target && [mid] > target {
right = mid; right也可以等于mid - 1
} else {
left = mid + 1;
}
*/
if (nums[left] <= target && nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
} else { // mid右面是有序递增的
if(nums[mid] < target && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return -1;
}
};