剑指 Offer 53 - I. 在排序数组中查找数字 I

#include<iostream>
#include<vector>
using namespace std;
//二分边界问题的探讨
//1.确定左右边界
//两种方法  [0,n) 或者[0,n-1]
//即初始化 l=0 r=n 或者l=0 r=n-1
//习惯用于第一种
//2.确定终止条件
//这里用是否能遍历数组所有元素来进行记忆
//如果是[0,n)  while(l<r)即可 
//可以带入特值法验证 当n=1时 即只有一个元素 [0,1) l若用l<=r 当l=r=1时 会取到1 而实际不存在1处位置 会报错 
//所以要用l<r此时当l=r=1时会跳出
//若是[0,n-1]  当只有1个元素 [0,0]若用l<r 则l=r=0这个元素取不到  只能用l<r
//3.获得中点 注意取中点时不要溢出长度
//4.收缩区间
//必须保证每次进入while之后 区间要缩小不能无限循环
//当为[0,n)
//1)left=mid 当mid对应不可能是解时 必须舍弃mid 因为left可以被取到 当left=mid的时候 就无限循环了 
//2)left=mid+1  所以必须选2)
//a)right=mid 当mid不可能为解时 舍弃mid 因为由2 终止条件知 right取不到 所以right可以等于mid
//b)right=mid-1 如果right=mid-1 又因为right取不到  所以mid-1取不到


class Solution {
public:
    int search(vector<int>& nums, int target) {
        int l=0;
        int r=nums.size();
        int k=l+r>>1;
        while(l<r)
        {
            k=l+(r-l)/2;
            if(nums[k]>target)
            {
                r=k;
            }
            else if(nums[k]==target)
            break;
            else if(nums[k]<target)
            {
                l=k+1;
            }
        }
        int m=k;
        int count1=0;
        while(1)
        {
            if(nums[m]==target)
            {
                count1++;
                m--;
            }
            else break;
        }
        m=k+1;
        while(1)
        {
            if(nums[m]==target)
            {
                count1++;
                m++;
            }
            else break;
        }
        return count1;
    }
};
int main()
{

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值