二分法

理解

原理:如何将一个问题,可以将规模为n的问题,通过O(1)的时间,变成规模为n/2的问题。

表达式:T(n)= T(n / 2) + O(1) = O(logn)。log{_{2}^{n}} = {x},当输入规模n = 8时,x = 3,代表8除3次2等于1。

问题:如何得到O(logn)?

解答:T(n)= T(n / 2) + O(1)= T(n / 4) + O(1)+ O(1)= T(n / 8) + O(1)+ O(1)+ O(1)= ...经过logn次后... =  O(logn)

如果 T(n)= T(n / 2) + O(n) = ?

解答:T(n)= T(n / 2) + O(n)= T(n / 4) + O(n / 2)+ O(n)= T(n / 8) + O(n / 4)+ O( n / 2)+ O(n)= O(1) + ... + O(n / 4)+ O( n / 2)+ O(n) =  O(1+..+ n / 8 + n / 4 + n / 2 + n)= 通过等比公式 a_{i} = a_{1} \times q^{n-1}S_{n}= \frac{a^{n}}{1-q}     计算可得 = O(2n) = O(n)

有关时间复杂度的题型

二分法常见痛点

通用的二分法模板

1.循环的结束条件是 start + 1 < end ,并且永远是start + 1 < end

2.不纠结到底哪一个是target,在循环结束后再来判断start和end索引位哪一个是要的target

int binarySearch(int[] nums,int target)
{
    if(nums == NULL || nums.length == 0)
    {
        return -1;
    }
    
    int start = 0, end = nums.length - 1;
    //相邻就退出循环
    //start = 1,end = 2就要退出
    while(start + 1 < end)
    { 
        //int mid = (start + end) / 2;对于start,end ~ 2^31,不会下标越界
        int mid = (end - start) / 2 + start;
        
        if(target == nums[mid]) end
        {
            end = mid;
        }
        else if(target <nums[mid])
        {
            end = mid;
        }
        else
        {
            start = mid;
        }
    }

    //double check
    if(nums[start] == target)
    {
        return start;
    }
    if(nums[end] == target)
    {
        return end;
    }
    return -1;
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值