Python 每日一练 二分查找 搜索旋转排序数组 详解

简介: Python 每日一练 二分查找 搜索旋转排序数组 详解

大一在读 大数据管理与应用专业 欢迎交流


备战蓝桥杯 倒计时71天


目前主要学习Python算法与数据结构 今日主题:二分查找


算法人算法魂 算法题让我们敢于挑战自己做意想不到的事情


如果还没接触过二分查找的可以看一下小郑上一篇博客保证入门简简单单(有模板)(属于优化版 适用很多场景 但今天这道题用起来就相形见绌了)


今天这个二分写法与上面的模板有所不同 是最基本的写法👇很简单对吧

#核心框架

while a<=b:
    mid=(a+b)//2
    if nums[mid]==target:
        return mid
    elif nums[mid]>target:
        b=mid-1
    else:
        a=mid+1

👇👇现在来让我们试试手


问题描述:

image.png


如果你觉得比较难?先看看这种方法


Python 自带函数解法:index函数用法传送门

Python List index()方法 | 菜鸟教程 (runoob.com)

https://www.runoob.com/python/att-list-index.html


class Solution:
    def search(self, nums: List[int], target: int) -> int:
        return nums.index(target) if target in nums else -1

image.png

二分查找法:


你肯定会说 ''这是无序的!!   二分查找只能用于有序数组 ''


对的 二分查找的确只能用于有序数组

但是审题后我们会发现:nums是由升序数组旋转得到(旋转规则根据题意可知)

先说结论 旋转后的数组 指针定在任意一个位置 那么两段序列中至少有一段是升序的

                                                   (我知道你有点不完全相信我!!)


但事实就是如此:

image.png


第一行是未旋转的升序序列 第二行是旋转后的


当指针指向中间 有两段升序序列


当指针指向右边(2)2到n-1是升序的 n到2不是升序的 因此有一段升序序列


当指针指向左边(n+1)n到n+1是升序的 n+1到n-1不是升序的 因此有一段升序序列


所以说明上面的结论是正确的 (或许你可能觉得我这样证明还不严谨)


那下面给出严格证明:假设数列元素>2个 (一个旋转了还是本身)


设k为分界点 下标0-k升序 下标k-len(nums)-1升序 对数列进行旋转


旋转后 指针指向k 旋转数列有两段升序序列 指向<k的位置 k左半边是有序


指向>k的位置 k右半边是有序   证明完毕


代码设计思路:拿到旋转后的数组  划分区域:有序的 无序的

对有序的二分查找 如果找到 大功告成

如果找不到 返回第一步 再次对第一轮的无序区域划分有序区域和无序区域

发现了吗?这其实就是一个递归的过程 因此我们设置两个指针l和r 用来递归每一次的无序区间 😀


class Solution:
    def search(self, nums: List[int], target: int) -> int:
        def Binary_search(l,r,target):
            if l==r and nums[l]!=target:return -1  
            mid=(l+r)//2#至少有一段是完全递增的
            if nums[mid]<nums[l]:#有序区间在右,对其对分查找
                a,b=mid,r
                while a<=b:
                    middle=(a+b)//2
                    if nums[middle]==target:
                        return middle
                    elif nums[middle]>target:
                        b=middle-1
                    else:
                        a=middle+1
                return Binary_search(l,mid-1,target)#如果右有序区间没找到 去找左无序区间
            else:#有序区间在左,对其对分查找
                a,b=l,mid
                while a<=b:
                    middle=(a+b)//2
                    if nums[middle]==target:
                        return middle
                    elif nums[middle]>target:
                        b=middle-1
                    else:
                        a=middle+1
                return Binary_search(mid+1,r,target)#如果左有序区间没找到 去找右无序区间
        return Binary_search(0,len(nums)-1,target)

image.png

好啦 今天的每日一练就到这里 祝大家新年快乐😀和小郑一起加油  


目录
相关文章
|
开发框架 Java 编译器
【Qt 元对象系统 01 】深入探索Qt的元对象系统:核心地位、功能与构成
【Qt 元对象系统 01 】深入探索Qt的元对象系统:核心地位、功能与构成
577 1
|
12月前
|
人工智能 前端开发 Docker
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
在 AI 智能体开发中,开发者常面临本地调试与云端部署的矛盾。本文介绍如何通过 Docker Compose 与 Docker Offload 解决这一难题,实现从本地快速迭代到云端高效扩容的全流程。内容涵盖多服务协同、容器化配置、GPU 支持及实战案例,助你构建高效、一致的 AI 智能体开发环境。
1039 2
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
|
12月前
|
机器学习/深度学习 存储 自然语言处理
NLP参数高效迁移学习:Adapter方法——论文简读
本研究深入探讨了自然语言处理中参数高效的迁移学习方法——Adapter。通过在预训练模型中引入小型可训练模块,仅调整少量额外参数即可完成模型适配。理论分析表明,该方法在初始化时保持网络行为稳定,并通过瓶颈结构大幅压缩参数规模。实验结果显示,Adapter在GLUE基准上仅用3.6%的参数便达到接近全微调的性能,且对学习率具有更强的鲁棒性。相比传统微调和其他参数高效方法,Adapter在多任务场景下展现出更优的存储效率与泛化能力,为大规模模型的实际部署提供了高效可行的解决方案。
818 7
|
JSON 监控 数据可视化
揭秘淘宝 API,让天猫店铺流量来源一目了然
在竞争激烈的电商环境中,天猫商家最关心的问题之一是流量来源。本文介绍如何利用淘宝开放平台的API接口,帮助商家清晰掌握店铺流量渠道,包括直接访问、搜索、广告及社交媒体流量。通过API获取数据后,可进一步分析访问量、来源占比、跳出率等关键指标,优化营销策略,提升转化率。结合Python编程与图表工具,实现数据可视化分析,助力商家做出数据驱动决策,抢占市场先机。
1106 1
|
监控 算法 自动驾驶
软件体系结构 - 调度算法(1) 最早截至时间优先
【4月更文挑战第19天】软件体系结构 - 调度算法(1) 最早截至时间优先
1569 0
|
供应链 数据可视化 开发者
供应链可视化工具:穿透全球贸易的迷雾
企业面临三重供应链挑战:多级库存失控、物流黑箱延误、风险传导滞后,导致巨额损失。破局需构建三维透视引擎——库存神经图谱、物流穿透雷达、风险预警熔断器。结合板栗看板、FourKites、Resilinc、Elementum等工具,打造高可视、强响应、韧性强的数字供应链体系,迎接2028年可视化竞争时代。
供应链可视化工具:穿透全球贸易的迷雾
|
JSON 前端开发 API
deepseek0528发布
DeepSeek-R1-0528 是 DeepSeek 团队于 2025 年发布的 R1 推理大模型升级版,虽定位为“小版本试升级”,但表现远超预期。其在数学推理(AIME 测试准确率提升至 87.5%)、编程能力(接近 OpenAI o3 水平,可生成 1000+ 行无 bug 代码)、长文本处理(支持 128K tokens)及写作质量等方面均有显著提升。此外,新增 Function Calling 和 JSON 输出功能,便于开发者集成。用户可通过 Ollama 本地部署或访问 https://chat.deepseek.com/ 在线体验满血版。
|
数据采集 Java Python
如何用Python同时抓取多个网页:深入ThreadPoolExecutor
在信息化时代,实时数据的获取对体育赛事爱好者、数据分析师和投注行业至关重要。本文介绍了如何使用Python的`ThreadPoolExecutor`结合代理IP和请求头设置,高效稳定地抓取五大足球联赛的实时比赛信息。通过多线程并发处理,解决了抓取效率低、请求限制等问题,提供了详细的代码示例和解析方法。
600 0
如何用Python同时抓取多个网页:深入ThreadPoolExecutor
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
936 23
|
机器学习/深度学习 人工智能 测试技术
新年第一弹,Qwen2.5-Max来了!
新年第一弹,Qwen2.5-Max来了!
2489 4

热门文章

最新文章