力扣二分查找学习计划 第五天

278. 第一个错误的版本

这题给了个函数 bool isBadVersion(version) 来返回当前版本(version)是正确的还是错误的,需要注意的是正确返回的是false,错误返回true。

// The API isBadVersion is defined for you.
// bool isBadVersion(int version);

class Solution {
public:
    int firstBadVersion(int n) {
        long long int p=0,q=n;
        while(p<q){
            long long int mid=p+(q-p)/2;
            if(isBadVersion(mid)){
               q=mid;
            }
            else{
                p=mid+1;
            }
        }
        return q;
    }
};



34. 在排序数组中查找元素的第一个和最后一个位置

 用O(n)的方法来做的话,这题就是简单题,来看看二分的做法吧

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        //特判
        if(nums.size()==0){
            return {-1,-1};
        }
        vector<int> ans(2);
        ans[0]=ans[1]=-1;
        //q为第一个大于target的元素的下标
        //right是第一个大于等于target的元素的下标
        int p=0,q=nums.size()-1;
        int left=0,right=q;
        //二分确定q和right位置
        while(p<q){
            int mid=p+(q-p)/2;
            if(nums[mid]>target){
                q=mid;
            }
            else{
                p=mid+1;
            }
        }
        while(left<right){
            int mid=left+(right-left)/2;
            if(nums[mid]>=target){
                right=mid;
            }
            else{
                left=mid+1;
            }
        }
        //right==q时可能数组中没有等于target的元素,或者nums里只有一个等于target的元素
        if(right!=q||right==q&&nums[q]==target){
            ans[0]=right;
            ans[1]=q-1;
        }
        if(nums[q]==target){
            ans[1]++;
        }
        return ans;
    }
};

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乔千玫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值