算法day1 二分查找
题目描述:

思路:
二分查找是搜索问题的经典问题。在这道题中,我们已知有序且升序的数组nums,那么我们可以设置三个指针low,mid,high。其中,我们令low = 0,high = nums.size()-1,那么初始的mid即为(low+high)/2。随后我们要设置循环的判断条件,此时就可以分两种常用区间情况考虑:
1.[low,high]。如果是以整体闭区间来写这个循环判断,那么在接下来的low、high指针的迭代中则要取low = mid+1或high = mid - 1。因为在左闭右闭的条件下,我们在循环流程中会访问到当前的nums[mid],所以更新后区间范围应不包括mid;
对应的代码如下:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1 ; //获取vector的个数要使用的函数是vector.size();
int mid = (left + right) / 2 ;
while(left <= right){
if(nums[mid]>target){
right = mid - 1;
mid = (right + left) / 2 ;
}else if(nums[mid]<target){
left = mid + 1 ;
mid = (right + left) / 2 ;
}else{
cout<<mid<<endl;
return mid;
}
}
mid = -1;
return mid;
}
2.[low,high):如果是以左闭右开区间来写这个判断,那么在接下来的low、high指针的迭代中则要取low = mid+1 ,high = mid,因为在这样的条件下,mid至high的区间实际上是缺少了一次关于nums[mid]的访问,所以更新后,在high侧应该包括更新前的mid。
对应的代码如下:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size(); //获取vector的个数要使用的函数是vector.size();
int mid = (left + right) / 2 ;
while(left < right){
if(nums[mid]>target){
right = mid ;
mid = (right + left) / 2 ;
}else if(nums[mid]<target){
left = mid + 1 ;
mid = (right + left) / 2 ;
}else{
cout<<mid<<endl;
return mid;
}
}
mid = -1;
return mid;
}
时间复杂度:O(logn);
空间复杂度:O(1)
END
浙公网安备 33010602011771号