算法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

posted on 2025-04-05 20:45  sakura430  阅读(19)  评论(0)    收藏  举报