二分法 左闭右闭
边界条件为target在最左端或者最右端
此时,left = middle = right - 1
或者 right = middle = left + 1
class Solution1{
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while(left<=right){
int middle = left + ((right - left)>>1);
if(nums[middle]==target){
return middle;
}
if(nums[middle]>target)
{
right = middle - 1;
}
if(nums[middle]<target)
{
left = middle + 1;
}
}
return -1;
}
};
二分法 左闭右开
极端条件在数组的最左端或者最右端
此时left = middle = right - 1
或者 left = middle = right - 1
左闭右闭合左闭右开最大的区别在于:
左闭右开left 永远也不不会小于right,
并且我们要设定的迭代范围left~right 为 [0,nums.size[]
class Solution{
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();
while(left<right){
int middle = left + (right - left)/2;
if(nums[middle]<target){
left = middle + 1;
}else if(nums[middle]>target){
right = middle;
}else{
return middle;
}
}
return - 1;
}
};
暴力算法
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() -1;
//length - 1 可能有等于0的情况
int length = right - left + 1;
for(int i = 0;i <= length - 1;i++){
if(nums[i] == target){
return i;
}
}
return -1;
}
};