C++二分查找

我们有一个有序序列,这个序列分为前后两个部分,分界点往前都不符合要求,往后都符合要求或者往前都符合要求,往后都不符合要求时,且我们需要在其中找到第一个满足要求或者第一个不满足要求或者最后一个满足要求或者最后一个不满足要求的元素位置时,我们往往会用二分查找来解决。
摘要由CSDN通过智能技术生成

二分查找简介

我们有一个有序序列,这个序列分为前后两个部分,分界点往前都不符合要求,往后都符合要求或者往前都符合要求,往后都不符合要求时,且我们需要在其中找到第一个满足要求或者第一个不满足要求或者最后一个满足要求或者最后一个不满足要求的元素位置时,我们往往会用二分查找来解决。

二分查找,顾名思义,就是每次取左端点和右端点的平均值,判断这个平均值是否符合要求,之后按情况改变左端点或右端点的值,直到左端点大于右端点输出答案(过会儿会详细讲解)。

那为什么不从头到尾枚举一遍呢?如果从头到尾枚举一遍,要是刚开始就有一个元素符合要求,那还好办,万一到最后才有符合要求的可就是On级别的时间复杂度了,可如果用二分查找就只用log2(n)级别了,大大减少了时间复杂度。

举个简单的例子:

题目描述:
给出一段序列和一个k,找出序列中第一个大于等于k的元素的位置。
保证序列为单调递增的序列。

输入格式:
第一行:两个正整数N和k,表示了序列的长度和要比较的值。
第二行:包含N个整数num[i],描述了这段序列。

输出格式:
一个整数,为第一个符合要求的元素的位置是多少。
如果没有符合要求的数

输入样例:

5 10
1 8 10 10 15

输出样例:

3

解决方法

先定义左端点l = 1,右端点r = n。之后开始循环直到左端点大于右端点才停止。循环中每次,取中点(即(l + r) / 2),判断中点是否符合要求,在此题中分界点前为不符合要求的,往后为符合要求的,是形如×××××××√√√√√√的样式,所以如果说中点符合要求(既为√),就让r &

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值