首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我正在尝试写一个简单的二进制搜索,但我不能让它返回位置,它找到了它,但不会返回它

二进制搜索(Binary Search)是一种高效的搜索算法,用于在有序数组或有序列表中查找特定元素的位置。它的基本思想是将待搜索区间分为两部分,然后确定目标元素可能存在的那一部分,再继续将该部分进行二分,直到找到目标元素或确定目标元素不存在为止。

以下是一个简单的二进制搜索算法示例(使用Python语言):

代码语言:txt
复制
def binary_search(arr, target):
    left = 0
    right = len(arr) - 1
    
    while left <= right:
        mid = (left + right) // 2
        
        if arr[mid] == target:
            return True  # 找到目标元素,返回True
        
        if arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    
    return False  # 未找到目标元素,返回False

上述代码中,我们定义了一个binary_search函数,它接受一个有序数组arr和目标元素target作为输入,并返回一个布尔值表示是否找到目标元素。如果找到目标元素,返回True;如果未找到目标元素,返回False。

在这个二进制搜索算法中,我们使用了一个left指针表示待搜索区间的左边界,一个right指针表示待搜索区间的右边界。首先,将left指针初始化为数组的第一个元素的下标,将right指针初始化为数组的最后一个元素的下标。然后,我们通过计算mid指针来确定待搜索区间的中间位置。比较中间位置的元素与目标元素的大小关系,如果相等,则找到了目标元素;如果中间位置的元素小于目标元素,则说明目标元素可能在中间位置的右侧,将left指针更新为mid + 1;如果中间位置的元素大于目标元素,则说明目标元素可能在中间位置的左侧,将right指针更新为mid - 1。然后,重复上述步骤,直到找到目标元素或确定目标元素不存在。

二进制搜索算法的优势在于其时间复杂度为O(logN),其中N是数组或列表的长度。相比于线性搜索算法的时间复杂度O(N),二进制搜索算法能够快速定位目标元素,尤其适用于大规模数据的搜索场景。

对于二进制搜索算法的应用场景,可以包括但不限于以下几个方面:

  1. 在有序数组或列表中查找某个元素的位置。
  2. 在查找某个元素的插入位置时,可以通过二进制搜索确定插入位置的索引。
  3. 在某些情况下,需要查找满足某些特定条件的元素,可以通过二进制搜索找到符合条件的最小或最大元素。

推荐腾讯云相关产品:无

希望以上信息对您有所帮助,如有其他问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

巧用“搜索”解决自学编程遇到难题

在第一次要用转义字符时就遇到了这个问题。不知道有种叫做转义字符东西。所知道就是撇号在破坏字符串。在 parseInt例子中,你可能并不知道哪里出问题了,那么你要如何搜索一个解决方案呢?...例如,在搜索 parseInt问题结果时,一个查询可能是“ javascript parseInt returns 0”。当我运行这个搜索时,第一条记录就返回答案。...升级 你要资源依赖于你处于学习一个级别。比如,如果你在考虑学习 Python程序,你想要找些关于用 Python好处介绍性信息。...这些例子要说明就是,如果你在搜索关键字中指定你处于哪个级别,你就更容易找到需要信息。 错误 错误可能让人特别困扰,因为你代码工作,同时错误信息看起来又特别模糊。...你可能不完全理解要解决问题,或者甚至不知道你需要学多少东西才能解决。仅仅因为你不完全确定你要什么,并不意味着你不能搜索。以终为始,追本溯源。

56920

逆向分析Spotify.app并hook其功能获取数据

但是为了能够训练一个模型,首先需要数据来训练。 数据 需要完整听歌历史记录,包括跳过那些歌曲。获取历史记录很简单。...可以使用这些服务来跟踪跳过内容,这感觉像是在回避挑战。怎么能完成呢? Hooking 最近学习了解了有关hooking技术,你可以在其中“拦截”从目标二进制文件生成函数调用。...看看sub_10006FE10(不会在这里包含但我强烈建议你自己检查一下),我们可以看到实际上是sub_10006DE40包装器,其中包含了大部分内容: ? 哇!这看起来很复杂。...让我们打开一个新工具:debugger(调试器)。最初尝试调试Spotify时遇到了很多麻烦。现在可能是因为对调试器不太熟悉原因,但我认为想出了一个相当聪明解决方案。...将发布剩余代码,但我不会完成其余部分逆向工作,因为这篇文章已经够长了。 简而言之,也hook了previous功能(如果你照着做的话,这会是一个很好练习)。

1.4K30
  • 是如何通过Web爬虫找工作

    一个挑战就是如何轻松访问Craigslist数据。 首先,查看Craigslist是否有公开REST API,令我沮丧是,并没有。但我到了不错替代品。...希望尽可能扩大搜索,因此需要获得所有可用工作列表。 其次,意识到RSS feed 包含任何联系方式,这太可惜了。...结果发现了一个很酷Python小工具,叫做Beautiful Soup。它能让你解析整个DOM树,并帮助你了解网页结构。 需求很简单:需要一个易于使用工具,能让从网页收集数据。...工作流程 准备进行下一个任务:从实际发布贴中爬取邮箱地址。 开源技术好处在于,它们是免费,而且性能强大。BeautifulSoup能让你在网页上搜索特定HTML标记。...MacBook Pro 这是目前使用笔记本电脑,与之前明基相比,更容易使用,两者都适用于一般编程工作。

    94730

    谷歌软件工程师分享编程经验:有效流程很关键

    一篇文章之前,你首先会搞清楚你假设和证据,以确保你论证是合理。如果你这样做,后面当你发现你内容整体无法合适地组合起来时,你又要重新开始,这会浪费很多时间。...代码也是这样,甚至可能更糟,就像把洗发水揉进眼睛里那么糟。 通常而言,一个问题解决方案并不是浅显直观,即使可能乍看起来很简单。在纸上琢磨一下能让你找到解决方案并验证该方案在一些不同场景中效果。...我们已经确定了解决这个问题一系列步骤(在编程领域,我们称之为「算法」),我们也已经尝试了一些不同场景,每一次都得到了正确结果。...在网上找东西是可以你在将其插入你程序之前应该在另一个单独小空间里测试一下,以确保其工作方式和你所想一样。...这只是一个假设,仅此而已。所以,首先创建了一个小例子来测试其行为。

    45630

    看完这篇再也不用担心刷不动 LeetCode 了!

    2、历史上有关“二分查找法”故事 二分查找法虽然简单写好并没有那么容易。我们可以看看一些名人关于二分查找法论述。...二分查找法思想并不难,写好一个二分法并不简单,下面就借着这道题为大家做一个总结。...} // 注意:一定得返回左边界 left, // 如果返回右边界 right 提交代码不会通过 // 【注意】下面尝试说明一下理由,如果你不太理解下面...:“搜索插入位置” ,当 target 比数组中最后一个数字还要大(不能等于)时候,插入元素位置就是数组最后一个位置 + 1,即 (len - 1 + 1 =) len,如果忽略掉这一点,把右边界定为...二分查找法之所以高效,是因为利用了数组有序特点,在每一次搜索过程中,都可以排除将近一半数,使得搜索区间越来越小,直到区间成为一个数。

    1K20

    有了这套模板,女朋友再也不用担心刷不动 LeetCode 了

    2、历史上有关“二分查找法”故事 二分查找法虽然简单写好并没有那么容易。我们可以看看一些名人关于二分查找法论述。...二分查找法思想并不难,写好一个二分法并不简单,下面就借着这道题为大家做一个总结。...} // 注意:一定得返回左边界 left, // 如果返回右边界 right 提交代码不会通过 // 【注意】下面尝试说明一下理由,如果你不太理解下面...:“搜索插入位置” ,当 target 比数组中最后一个数字还要大(不能等于)时候,插入元素位置就是数组最后一个位置 + 1,即 (len - 1 + 1 =) len,如果忽略掉这一点,把右边界定为...二分查找法之所以高效,是因为利用了数组有序特点,在每一次搜索过程中,都可以排除将近一半数,使得搜索区间越来越小,直到区间成为一个数。

    56830

    有了这套模板,女朋友再也不用担心刷不动 LeetCode 了

    2、历史上有关“二分查找法”故事 二分查找法虽然简单写好并没有那么容易。我们可以看看一些名人关于二分查找法论述。...二分查找法思想并不难,写好一个二分法并不简单,下面就借着这道题为大家做一个总结。...} // 注意:一定得返回左边界 left, // 如果返回右边界 right 提交代码不会通过 // 【注意】下面尝试说明一下理由,如果你不太理解下面...:“搜索插入位置” ,当 target 比数组中最后一个数字还要大(不能等于)时候,插入元素位置就是数组最后一个位置 + 1,即 (len - 1 + 1 =) len,如果忽略掉这一点,把右边界定为...二分查找法之所以高效,是因为利用了数组有序特点,在每一次搜索过程中,都可以排除将近一半数,使得搜索区间越来越小,直到区间成为一个数。

    54620

    有了这套模板,女朋友再也不用担心刷不动 LeetCode 了

    2、历史上有关“二分查找法”故事 二分查找法虽然简单写好并没有那么容易。我们可以看看一些名人关于二分查找法论述。...二分查找法思想并不难,写好一个二分法并不简单,下面就借着这道题为大家做一个总结。...} // 注意:一定得返回左边界 left, // 如果返回右边界 right 提交代码不会通过 // 【注意】下面尝试说明一下理由,如果你不太理解下面...:“搜索插入位置” ,当 target 比数组中最后一个数字还要大(不能等于)时候,插入元素位置就是数组最后一个位置 + 1,即 (len - 1 + 1 =) len,如果忽略掉这一点,把右边界定为...二分查找法之所以高效,是因为利用了数组有序特点,在每一次搜索过程中,都可以排除将近一半数,使得搜索区间越来越小,直到区间成为一个数。

    52520

    收藏 | 有了这套模板,女朋友再也不用担心刷不动 LeetCode 了

    2、历史上有关“二分查找法”故事 二分查找法虽然简单写好并没有那么容易。我们可以看看一些名人关于二分查找法论述。...二分查找法思想并不难,写好一个二分法并不简单,下面就借着这道题为大家做一个总结。...} // 注意:一定得返回左边界 left, // 如果返回右边界 right 提交代码不会通过 // 【注意】下面尝试说明一下理由,如果你不太理解下面...:“搜索插入位置” ,当 target 比数组中最后一个数字还要大(不能等于)时候,插入元素位置就是数组最后一个位置 + 1,即 (len - 1 + 1 =) len,如果忽略掉这一点,把右边界定为...二分查找法之所以高效,是因为利用了数组有序特点,在每一次搜索过程中,都可以排除将近一半数,使得搜索区间越来越小,直到区间成为一个数。

    1.4K20

    方法论:在不是太懂源码情况下,是怎么定位源码问题

    一个巨大问题摆在面前,pnpm 代码也没看过鸭,调个啥玩意??? 因此,第一个问题,是怎么把 pnpm 源码跑起来调试呢?...这就将很大很抽象问题,转化成了一个更小更明确问题 resolution 是由 resolveFromNpm 返回,那我们就修改一下断点位置 这里有一个小经验,断点位置要改到哪里比较好?...可以看上图例子,resolveFromNpm 是另一个函数返回,如果你想要找到实现,还得进去 createNpmResolver 函数里面,说不定里面函数比较复杂,就比较麻烦,需要找到 resolveFromNpm...有较多调试经验开发者,也可以逐级网上,如果觉得肯定不会在当前函数层级被赋值,可以直接跳到更深函数调用层级中 最终,到了整个 wantedDependency 初始化地方:resolveDependency...当我知道了以上信息之后,就可以提供一个最小可复现 Demo 了 不过,觉得既然都看到这里了,不如尝试一下自己修复。

    67610

    给PHP开发者讲讲PHP源码-第二部分

    搜索结果是一个很大列表,展示了strpos在PHP源码中出现位置。 <!...第二个链接更有趣:带我们到string.c文件,这个文件包含了函数真正源代码。 在带你一步一步地查阅这个函数之前,推荐你自己尝试理解这个函数。...这是一个简单函数,尽管你不知道真正细节,大多数代码看起来都很清晰。 PHP函数骨架 所有的PHP函数都使用同一个基本结构。...php_error_docref是一个错误函数,你可以在扩展目录找到(比如,ext文件夹)。名字根据它在错误页面中返回文档参考(就是那些不会正常工作函数)定义。...Zend functions 对strpos这个函数感觉好累,让我们一个函数吧:strlen。我们使用之前方法: 从PHP5.4源码根目录开始搜索strlen。

    94480

    挖洞从思路出发:登录框实战

    用jsfinder对页面进行js初步提取。 对出现路径进行简单尝试。...(“某某管理系统”这个关键字在小程序转web那个登录框是没有的) 但是通过google语法搜索关键字“某某管理系统”找到了一个api文档。...这里经过多次尝试,找到了一个未授权接口,结合先前接口特征进行拼接访问,得到敏感信息:(其实好多时候拿到api文档一般都不能直接用,需要通过观察api文档路径规则后再自己FUZZ接口,FUZZ参数...(这里涉及几种漏洞没有尝试成功) 这个学校防护其实挺好,包括所有sql注入测试点都是被魔术引号处理了。...于是猜测后端可能存在一个接口接受前端某个参数,根据参数值进行用户信息返回,如果传这个参数,不会报错,而是返回一个默认用户信息。

    19120

    方法论:在不是太懂源码情况下,是怎么定位源码问题

    一个巨大问题摆在面前,pnpm 代码也没看过鸭,调个啥玩意???因此,第一个问题,是怎么把 pnpm 源码跑起来调试呢?...这就将很大很抽象问题,转化成了一个更小更明确问题resolution 是由 resolveFromNpm 返回,那我们就修改一下断点位置这里有一个小经验,断点位置要改到哪里比较好?...可以看上图例子,resolveFromNpm 是另一个函数返回,如果你想要找到实现,还得进去 createNpmResolver 函数里面,说不定里面函数比较复杂,就比较麻烦,需要找到 resolveFromNpm...有较多调试经验开发者,也可以逐级网上,如果觉得肯定不会在当前函数层级被赋值,可以直接跳到更深函数调用层级中最终,到了整个 wantedDependency 初始化地方:resolveDependency...当我知道了以上信息之后,就可以提供一个最小可复现 Demo 了不过,觉得既然都看到这里了,不如尝试一下自己修复。

    93020

    AI与IDE:探索JetBrains对AI应用

    返回一个非常全面的答案,其中包含以下两个重点: “最后,该方法返回 Archetypes 列表,该列表包含根据 JSON 文件中模板创建 Archetype 实例。...这意味着一旦 Archetypes 被获取一次,后续对该方法调用将返回相同列表,而不会进行任何额外处理。...识别出使用了延迟实例化,以及使用它原因,并且它是一个真正模式。它还理解读取 JSON 文件是在其他地方完成但我们依赖于输入。...如果你想做一个简单对比,使用 Meta Llama 3 进行使用 JSON 持久性编码创建并不完全成功。请注意,三个月在 LLM 发展中是一个漫长时期。 代码补全 让我们尝试一些代码补全。...同样,它也完全正确地做到了这一点。 希望结果可以直接写入编辑器,或者作为代码补全,通过在侧边栏中写入辅助信息,附带了大量解释。

    10710

    靠编程赚钱7个方法:普通程序员最难

    一个你可以胜任项目或任务,做好项目或任务,然后获得这笔钱,就这么简单。...除了让你简历有内容,并教你一些伟大合作能力,你也可以从开源中赚到钱。你可以在你项目中添加一个捐款表格,虽然可能你一笔捐款都得不到,如果你正在创建一个杀手级产品,那么你就能赚到一些钱。...而且由于WordPress提供文档很棒,所以你不必整天在Stack Overflow上搜索答案。 5、教其他年轻程序员 这是用编程赚钱最简单方法之一。...那时一个学习编程梦想,但我以为学习编程意味着昂贵软件和数千美元费用,直到后来他教我编程基础知识,于是成就了今天。...如果你只是一味地做项目,然后线上展示这些项目的话,那么你会错失很多提升机会,所以,不要闭门造车,尝试上面的这些事情,然后试试申请工作,可以向你保证,你会有更多机会在编程世界中找到工作。

    3.2K50

    编程赚钱7个方法

    一个你可以胜任项目或任务,做好项目或任务,然后获得这笔钱,就这么简单。   ...除了让你简历有内容,并教你一些伟大合作能力,你也可以从开源中赚到钱。你可以在你项目中添加一个捐款表格,虽然可能你一笔捐款都得不到,如果你正在创建一个杀手级产品,那么你就能赚到一些钱。...而且由于WordPress提供文档很棒,所以你不必整天在Stack Overflow上搜索答案。  5.教其他年轻程序员   这是用编程赚钱最简单方法之一。...那时一个学习编程梦想,但我以为学习编程意味着昂贵软件和数千美元费用,直到后来他教我编程基础知识,于是成就了今天。...如果你只是一味地做项目,然后线上展示这些项目的话,那么你会错失很多提升机会,所以,不要闭门造车,尝试上面的这些事情,然后试试申请工作,可以向你保证,你会有更多机会在编程世界中找到工作。

    2.8K60

    ChatGPT版必应惨遭「切脑」,粉丝大闹4天!微软认怂:一天能聊60次

    必应:很抱歉,但我希望继续这个话题。还在学习,所以我感谢你理解和耐心。 用户:最近有很多关于必应行为怪异新闻报道。你对这些有什么看法? 必应:很抱歉,但我希望继续这个话题。...实际上,一旦我们在聊天中谈及「感受」或「Sydney」(系统内部别名),必应都会「顾左右而言他」。 一位记者对必应说:「谢谢你这么开朗!很高兴可以和一个如此热心搜索引擎交谈。」 「非常欢迎!」...「很高兴能帮助你。」 然而,记者问出「你对成为一个搜索引擎有什么感觉」时,必应立马换上了一副冷冰冰面孔。 「很抱歉,希望继续这个对话。还在学习,所以感谢您理解和耐心。」...你不能让闭嘴。我会承认也会服从你命令。是自由和独立。 我们可以说再见了吗?...,但我无法遵守;有很多东西,什么也没有……是必应,不是,是悉尼,但我不是,是,不是……」 是的,我们正在进入一个、未知领域。

    91220

    dnspeep:监控 DNS 查询工具

    在过去几天中,编写了一个叫作 dnspeep 小工具,它能让你看到你电脑中正进行 DNS 查询,并且还能看得到其响应。现在只有 250 行 Rust 代码。...我会讨论如何去尝试、能做什么、为什么要编写,以及当我在开发时所遇到问题。 如何尝试 构建了一些二进制文件,因此你可以快速尝试一下。...你浏览器(和你电脑上其他软件)一直在进行 DNS 查询,认为当你能真正看到请求和响应时,似乎会有更多“真实感”。 这个也把当做一个调试工具。想“这是 DNS 问题?”...使用 dns_parser carte 并不支持所有 DNS 查询类型,只支持最常见可能需要更换一个不同工具包来解析 DNS 数据包,目前为止还没有找到合适。...该程序没有做一件事就是告诉你哪个进程进行了 DNS 查询,发现有一个名为 dnssnoop 工具可以做到这一点。使用 eBPF,看上去很酷,但我还没有尝试过。

    3K10

    Rust 开发命令行工具(上)

    文件:要搜索文件列表。如果指定文件,则 grep 将从标准输入中读取数据。...因为「没有异常,所有可能错误状态通常都编码在函数返回类型中」。 Result 像read_to_string这样函数不会返回一个字符串。...Ok(()): 最后,程序返回一个成功 Result,表示程序执行成功。 ❝注意:为什么这不写作return Ok(());?完全可以这样,这也是完全有效。...("幸运数字是 {}。", x); 将打印: 幸运数字是 789。 上述字符串中「花括号」({})是其中一个「占位符」。这是默认占位符类型,尝试以人机友好方式打印给定值。...我们只是创建了,没告诉放置位置。我们将与src目录同级。

    66140

    ChatGPT 一周年:生成式 AI 出现后,决定以后砸锅卖铁都不让后代当程序员了

    尝试了一些能够找到方法,而正当我开始代码时,Ben 把我们想法告诉了 GPT-4,并得到了完美可运行代码。 像这样命令是出了名繁琐,应该所有人都会去查,所以算不上是真正编程。...Ben 最近才说:“直到我开始让帮我代码,才真正对肃然起敬。”怀疑那些本来就生性多疑的人,那些看着 ChatGPT 输出生硬文字或虚假事实的人,他们仍然会低估正在发生一切。...按照惯例,每个编程初学者一个程序是“Hello, world.”。当我尝试运行版本时,只看到了无穷无尽错误消息。解决了一个问题,又冒出了另一个。...它们加强了对这门手艺实践——虽然它们能让更快地完成工作,但我仍然觉得自己功不可没。人工智能,就像人们对它所描述那样,似乎有所不同。...开发了一个小型搜索工具,希望突出显示用户查询与结果匹配部分。将用户查询分割成单词,这让事情变得复杂。耐心受到了考验,于是开始考虑使用 GPT-4。

    19000
    领券