class Solution {
public:
int search(vector<int>& nums, int target) {
// 确定左右哨兵 [mi,hi)
int lo = 0,hi = nums.size();
while (lo < hi){
int mi = (lo + hi) >> 1; // >> 1 等价于 /2 相对来说速度稍快
if (target < nums[mi]){
hi = mi;
}
else if (nums[mi] < target){
lo = mi + 1;
}
else {
return mi;
}
}
// 只要命中就会在前面退出,如果退出循环标识不存在 返回 -1
return -1;
}
};
class Solution {
public:
int search(vector<int>& nums, int target) {
int lo = 0,hi = nums.size();
Fib fib(hi - lo); // 初始化Fibnacci数列到数组长度
while (lo < hi){
// 不断将 fib数组缩小到界限内
while (hi - lo < fib.get()){
fib.prev();
}
// 获得下一个判断点
int mi = lo + fib.get() - 1;
if (nums[mi] < target){
lo = mi + 1;
}
else if (target < nums[mi]){
hi = mi;
}
else {
return mi;
}
}
return -1;
}
};
class Solution {
public:
int search(vector<int>& nums, int target) {
// 确定左右哨兵 [mi,hi)
int lo = 0,hi = nums.size();
while (lo < hi){
int mi = (lo + hi) >> 1;
if (target < nums[mi]){
hi = mi;
}
else {
lo = mi + 1;
}
}
// 最后一定会锁定到 一个不大于target数到最后一个然后 lo = mi + 1,所以我们只要退一步就是我们需要的值
// 因为需要判断 lo-1 有可能lo == 0,所以排除一下特殊情况
return lo-1 >= 0 && nums[lo-1] == target ? lo-1 : -1;
}
};