Python数据结构【二】查找

前言

可私聊进一千多人Python全栈交流群(手把手教学,问题解答)
进群可领取Python全栈教程视频 + 多得数不过来的计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。

  • 🚀🚀加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!

  • 一、查找是什么

    查找,顾名思义,就是找某个东西。

    不过一般都是在某个数据结构里面查找,有在数组(Python是列表)查找的,有在链表查找的,有在字典查找的。

    较为官方的描述

    在一些数据元素中,通过一定的方法找出给定的数据元素。

    在编程中,查找总是与循环挂钩的,而又分为,线性查找,二分查找等查找方法。

    二、线性查找

    线性查找就比较简单了,就是在列表中顺序查找某个元素。

    上代码!

    def find_num(li,num):
        """
        li: 列表
        num: 要找的数
        """
        for i in range(len(li)):
            if li[i]==nums:
                return i
        return None
    

    这就是一个简简单单的线性查找,找出列表中是否存在某个元素,如果存在,就返回下标,不存在就返回None

    当然,这只是最基础的,说的稍微进阶的,这就不得不拿出力扣的第一题了,我第一次做力扣的时候就有点头疼

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。
    
    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
    
    你可以按任意顺序返回答案。
    

    两数之和实例

    实例1

    输入:nums = [2,7,11,15], target = 9
    输出:[0,1]
    解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
    

    实例2

    输入:nums = [3,2,4], target = 6
    输出:[1,2]
    

    实例3

    输入:nums = [3,3], target = 6
    输出:[0,1]
    

    两数之和解析(线性查找版)

    顾名思义,挨个找,然后判断,然后返回下标,然后由于我们需要判断两个元素的和是否符合题目,所以我们就需要嵌套循环来实现在同一个列表中查找两个元素的和。

    代码实现

    class Solution:
        def twoSum(self, nums: List[int], target: int) -> List[int]:
            for i in range(len(nums)):
                for j in range(len(nums)):
                    if i==j:
                        continue
                    elif nums[i]+nums[j]==target:
                            return [i, j]
    

    通过截图:

    在这里插入图片描述

    三、二分查找

    二分查找就是分出两个指针,分别在头部尾部,然后头部指针加,尾部指针减来比对两数之和(当然使用二分的前条件的列表是有序的)

    如果首尾指针对应的元素和比题目给定的两数之和大,就说明当前的和较大,将查找范围减半,将尾部指针跳转到中间

    如果小,就说明两个元素之和较小,就将范围减小一半,将首部指针跳转到中间。

    然后直到查找完毕。

    还是上个图吧

    在这里插入图片描述

    练习

    题目:

    给定一个列表[1, 3, 6, 8, 10, 13],找出两数之和为9的两个元素,并返回它们的下标

    代码:

    def mid_find(li, num):
        left = 0                        # 首部指针
        right = len(li) - 1             # 尾部指针
        for i in range(len(li)):        # 循环
            mid = (left + right + 1) // 2   # 指针跳转位置
            if li[left] + li[right] == num and left != right:
                # 符合的直接返回
                return [left, right]
            elif li[left] + li[right] > num:
                right = mid
            else:
                left = mid
    li = [1, 3, 6, 8, 10, 13]
    print(mid_find(li, 9))
    

    运行结果:

    在这里插入图片描述

    二分查找库bisect_left函数

    使用方法:

    j = bisect.bisect_right(li, num, right, n)

    li:要查找的数组

    num:要查找的数

    right:上界

    n:长度

    返回的是大于等于要查找数的第一个下标

    所以我们的代码就可以写成:

    def mid_find(li, num):
        left = 0                        # 首部指针
        right = len(li) - 1             # 尾部指针
        for i in range(len(li)):        # 循环
            t = num-li[i]
            j = bisect_left(li,t, i+1, len(li))
            if j < len(li) and li[j] == t:
                return [i,j]
    li = [1, 3, 6, 8, 10, 13]
    print(mid_find(li, 9))
    

    运行结果:

    在这里插入图片描述

    两数之和解析(二分版)

    首先肯定是需要先排序的,那么排完序不就好做了吗?

    不,这个题的难点在于需要返回的是原列表的下标,所以我们在使用排序的时候,还得保证得到答案后我们返回的下标是原来没有排序的下标

    所以我们就需要将原列表和下标进行一个绑定,使用zip函数

    代码:

    class Solution:
        def twoSum(self, nums: List[int], target: int) -> List[int]:
            n = len(nums)                   # 列表长度
            nums = sorted(zip(nums,range(n)))        # 排序
            for i in range(n):
                t = target-nums[i][0]
                j = bisect_left(nums, (t, ), i+1, n)
                if j < n and nums[j][0] ==t:
                    return [nums[i][1], nums[j][1]]
            return []
    

    通过截图

    在这里插入图片描述

    结语

    算法是需要大量练习才能掌握的,所以不能眼高手低,虽然可能看都看不懂(=.=)

    但是只需要多加练习,就可以慢慢懂得了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/551714.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手动实现简易版RPC(下)

手动实现简易版RPC(下) 前言 什么是RPC&#xff1f;它的原理是什么&#xff1f;它有什么特点&#xff1f;如果让你实现一个RPC框架&#xff0c;你会如何是实现&#xff1f;带着这些问题&#xff0c;开始今天的学习。 接上一篇博客 手动实现简易版RPC&#xff08;上&#xff…

抖音小店运营计划表年度电商规划管理模板

【干货资料持续更新&#xff0c;以防走丢】 抖音小店运营计划表年度电商规划管理模板 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 抖音店铺运营表格 &#xff08;完整资料包含以下内容&#xff09; 目录 抖音店铺运营计划&#xff1a; 一、店铺定位与目标…

MySql运维篇

目录 一.日志 1.1日志分类 1.2Error Log 1.3BinaryLog 1.4SlowQuery Log 二.备份 2.1备份原因 2.2备份目标 2.3备份技术 2.3.1物理备份 2.3.2逻辑备份 2.4备份方式 2.4.1完全备份 2.4.2增量备份 2.4.3差异备份 2.5备份环境准备 2.6完全备份实验 2.6.1完全备…

书生·浦语大模型全链路开源体系-第4课

书生浦语大模型全链路开源体系-第4课 书生浦语大模型全链路开源体系-第4课相关资源XTuner 微调 LLMXTuner 微调小助手认知环境安装前期准备启动微调模型格式转换模型合并微调结果验证 将认知助手上传至OpenXLab将认知助手应用部署到OpenXLab使用XTuner微调多模态LLM前期准备启动…

连锁服装卖场进销存一般怎么管理

连锁服装卖场的进销存管理是保证业务顺畅运作和最大化利润的关键之一。随着市场竞争的加剧和消费者需求的变化&#xff0c;良好的进销存管理能够帮助企业及时调整库存&#xff0c;减少滞销品&#xff0c;提高资金周转率&#xff0c;从而增强市场竞争力。本文将探讨连锁服装卖场…

单独设置浏览器滚动条上下箭头

解决方法 重点 ::-webkit-scrollbar-button:vertical 给垂直方向的滚动条设置样式 ::-webkit-scrollbar-button:vertical:start 上方向的按钮 ::-webkit-scrollbar-button:vertical:start:decrement 上方向单个按钮 下方向同理 不知道为啥搜索出来的single-button不生效&#…

制造业的数字化转型如何做?

随着科技的迅速发展&#xff0c;数字化转型已经成为制造型企业提高竞争力的关键因素。它可以帮助制造型企业&#xff0c;在产品优化设计、材料采购、生产流程方面实现精细化管理&#xff1b;提升上下游协同生产能力&#xff0c;提高生产效率、降低生产成本、优化产品质量&#…

华为的AI战略地图上,才不是只有大模型

大模型火热了一年&#xff0c;现在还没做AI化改造的企业&#xff0c;就像是工业革命浪潮伊始与火车赛跑的那辆马车。 最早的蒸汽火车缓慢又笨重&#xff0c;甚至铁轨上还预留了马匹行走的空间&#xff0c;以便随时用马拉火车来替代蒸汽火车&#xff0c;一辆华丽的马车试图和火…

浮点数的存储方式、bf16和fp16的区别

目录 1. 小数的二进制转换2. 浮点数的二进制转换3. 浮点数的存储3.1 以fp32为例3.2 规约形式与非规约形式 4. 各种类型的浮点数5. BF16和FP16的区别Ref 1. 小数的二进制转换 十进制小数转换成二进制小数采用「乘2取整&#xff0c;顺序排列」法。具体做法是&#xff1a;用 2 2…

C++语言·类和对象

1. 类的引入 C语言结构体中只能定义变量&#xff0c;但在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数&#xff0c;同时C中struct的名称就可以代表类型&#xff0c;不用像C那样为了方便还要typedef一下。 在C中我们管定义的结构体类型叫做类(student)&a…

idea 将项目上传到gitee远程仓库具体操作

目录标题 一、新建仓库二、初始化项目三、addcommit四、配置远程仓库五、拉取远程仓库内容六、push代码到仓库 一、新建仓库 新建仓库教程 注意&#xff1a;远程仓库的初始文件不要与本地存在名字一样的文件&#xff0c;不然拉取会因为冲突而失败。可以把远程一样的初始文件删…

汇舟问卷:推荐一个挣外国人钱项目

在海外&#xff0c;问卷调查作为一种普遍的市场研究手段&#xff0c;它们能够为企业下一季度的营销策略调整提供有力的数据支撑。 每份问卷的报酬金额各不相同&#xff0c;最低为1美元&#xff0c;最高可以达到10几美元。大多数问卷的报酬在3到5美元之间。 然而&#xff0c;在…

JS-42-Node.js01-Node.js介绍

一、浏览器大战 众所周知&#xff0c;在Netscape设计出JavaScript后的短短几个月&#xff0c;JavaScript事实上已经是前端开发的唯一标准。 后来&#xff0c;微软通过IE击败了Netscape后一统桌面&#xff0c;结果几年时间&#xff0c;浏览器毫无进步。&#xff08;2001年推出…

HDFS详解(Hadoop)

Hadoop 分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;HDFS&#xff09;是 Apache Hadoop 生态系统的核心组件之一&#xff0c;它是设计用于存储大规模数据集并运行在廉价硬件上的分布式文件系统。 1. 分布式存储&#xff1a; HDFS 将文件分割成若干块…

【游戏云服务器推荐】幻兽帕鲁 我的世界 雾锁王国 饥荒联机版 英灵神殿通用云服务器 2-64G随意选 附最新价格对比

更新日期&#xff1a;4月17日&#xff08;京东云采购季持续进行&#xff09; 本文纯原创&#xff0c;侵权必究 《最新对比表》已更新在文章头部—腾讯云文档&#xff0c;文章具有时效性&#xff0c;请以腾讯文档为准&#xff01; 【腾讯文档实时更新】2024年-幻兽帕鲁服务器专…

李飞飞团队发布《2024年人工智能指数报告》,预测人工智能未来发展趋势

昨天&#xff0c;斯坦福大学 Human-Center Artificial Intelligence (HAI)研究中心发布了《2024年人工智能指数报告》。 由斯坦福大学发起的人工智能指数&#xff08;AI Index&#xff09;是一个追踪 AI 动态和进展的非营利性项目&#xff0c;旨在全面研究 AI 行业状况&#xf…

不同质量图在卡尔曼滤波相位解缠中应用探讨

文献来源&#xff1a;不同质量图在卡尔曼滤波相位解缠中应用探讨 闫 满&#xff0c;郭春华 测绘科学技术, 2019, 7(2), 65-73 卡尔曼滤波将相位解缠转化为状态估计问题&#xff0c;实现相位解缠与噪声消除的一并处理。通过建立相位的动 态方程和观测方程来求解真实相位&#x…

The O-one:开源语言模型计算机的革命

在人工智能的浪潮中&#xff0c;The O-one作为一个创新的开源项目&#xff0c;正以其独特的功能和开放性吸引着全球开发者和科技爱好者的目光。这个项目不仅仅是一个简单的语言模型&#xff0c;它是一个能够通过语音交互与计算机进行对话的智能系统&#xff0c;极大地提升了人机…

Java面试题笔记(持续更新)

Java基础 java中的Math.round(-1.5)等于多少&#xff1f; Math的round方法是四舍五入,如果参数是负数,则往大的数如,Math.round(-1.5)-1&#xff0c;如果是Math.round(1.5)则结果为2 JDK和JRE的区别&#xff1f; JDK 是 Java Development ToolKit 的简称&#xff0c;也就是…

Java——代码块

目录 一.代码块概念以及分类 二.普通代码块 三.构造代码块 四.静态代码块 一.代码块概念以及分类 使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字&#xff0c;又可分为以下四种&#xff1a; 普通代码块构造块静态块同步代码块&#xff08;后续讲解多…