日常算法刷题——力扣704

##2023/3/2 刷算法的第一天

针对力扣的704题:本题是二分查找的基本使用!在此需要注意二分查找的基本特点:
1.数列基本有序;
2.数列数据内容不可重复。
此题只需了解二分查找算法的基本概念,无坑可跳。但在力扣上刷题就需要知道你所使用的语言的一些基本内容(显然我还不知)!

今天第一次刷题,对C++的vector只有基本的认识,现已经知晓:1.vector定义的向量名可以直接作为数组名来使用!
2.vector定义的向量求元素个数的函数是:向量名.size()。
代码见下:

class Solution {
    
    
public:
    int search(vector<int>& nums, int target) {
    
    
        // 左闭右闭
        int left=0,right=nums.size()-1;
        while(left<=right)
        {
    
    
            int mid=(left+right)/2;
            if(nums[mid]==target)
                return mid;
            else if(nums[mid]>target)
                right=mid-1;
            else
                left=mid+1;
        }
        return -1;
    }
};

不过这里我看代码随想录讲的这种是左闭右闭,还有一种的是左闭右开,这种写法你的坑会比较少,下面附上左闭右开,这种坑太多了!
左闭右开:

class Solution {
    
    
public:
    int search(vector<int>& nums, int target) {
    
    
        // 左闭右开
        int left=0,right=nums.size();
        //nums.size()输出的是元素个数,对应的是元素下标+1
        
        while(left<right)
        {
    
    
            int mid=(left+right)/2;
            if(nums[mid]==target)
                return mid;
            else if(nums[mid]<target)
                left=mid+1;
            else
                right=mid;
        }
        return -1;   
    }
};

坑一:nums.size()这里不用减一的原因是通过此函数取得的是元素个数,正是每个元素的下标值+1。而这样做的目的也正是为了达到[left,right)的目的!因为取出的值是大于数据下标最大值的,所以右边必然是闭区间。
坑二:当nums[mid]==target的时候,取得值照常理理解的是应该为mid-1,但是这里我们想到的是mid是通过mid=(left+right)/2取得的,所以它会自动向下取整,也就是已经减去1了;
坑三:当区间不匹配的时候,调整左的left和右的right是不一样的,原因是对于区间**[left,right)**,left是在区间内部,所以上一轮已经走过一次了,所以需要+1,对于right,它是在区间之外的,还未到达(也不可能到达),所以不要-1。

这是作为一个大四的人花费了很久弄出的一个题!

猜你喜欢

转载自blog.csdn.net/m0_55704585/article/details/129309933