二分法模板及类型题总结

注意:不懂的地方一定要在纸上划划,举几个例子,然后就能很好的理解了

二分法模板
力扣704链接

class Solution {
public:
    int search(vector<int>&nums,int target)
    {
        int left=0;
        int right=nums.size()-1;
        while(left<=right)
        {
            int middle=left+(right-left)/2;
            if(nums[middle]>target)
            {
                right=middle-1;
            }
            else if(nums[middle]<target)
            {
                left=middle+1;
            }
            else
            {
                return middle;
            }
        }
        //未找到目标值
        return -1;
    }

};

相关题目推荐

力扣35链接

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

力扣34链接

class Solution {
public:
     int firstposition(vector<int>&nums,int target)
     {
         int left=0;
         int right=nums.size()-1;
         while(left<=right)
         {
             int mid=(left+right)/2;
             if(nums[mid]==target)
             {
                 if(mid==0||nums[mid-1]<target)
                 {
                     return mid;
                 }
                 right=mid-1;
             }
             else if(nums[mid]>target)
             {
                 right=mid-1;
             }
             else if(nums[mid]<target)
             {
                 left=mid+1;
             }
         }
         return -1;
     }
     int lastposition(vector<int>&nums,int target)
     {
         int left=0;
         int right=nums.size()-1;
         while(left<=right)
         {
             int mid=(left+right)/2;
             if(nums[mid]==target)
             {
                 if(mid==nums.size()-1||nums[mid+1]>target)
                 {
                     return mid;
                 }
                 left=mid+1;
             }
             else if(nums[mid]>target)
             {
                 right=mid-1;
             }
             else if(nums[mid]<target)
             {
                 left=mid+1;
             }
         }
         return -1;
     }
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int>range;
        range.push_back(firstposition(nums,target));
        range.push_back(lastposition(nums,target));
        return range;
    }
};

力扣69链接

class Solution {
public:
     int mySqrt(int x) {
     int left=1;
     int right=x;
     while(left<=right)
     {
         long long middle=left+(right-left)/2;
         long long square=middle*middle;
         if(square>x)
         {
             right=middle-1;
         }
         else if(square==x)
         {
             return middle;
         }
         else
         {
            left=middle+1;
         }
     }
     return right;
  }
};

力扣367链接

**二分法:**
class Solution {
public:
    bool isPerfectSquare(int num) {
        int left=0;//因为num等于0有意义,所以左边界从0开始
        int right=num;
        if(num==0)
        {
            return true;
        }
        while(left<=right)
        {
            long long middle=left+(right-left)/2;
            long long square=middle*middle;
            if(square==num)
            return true;
            else if(square>num)
            right=middle-1;
            else
            left=middle+1;
        }
        return false;
    }
};
**数学方法:**
class Solution {
public:
    bool isPerfectSquare(int num) {
        int sub=1;
        if(num==0)
        return true;
        while(num>0)//注意此处num>0//因为num<0的时候也会发生循环
        {
            num-=sub;
            sub+=2;
        }
        if(num==0)
        return true;
        else
        return false;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路人Peak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值