Python数据结构【二】查找

news2024/10/6 16:23:46

前言

可私聊进一千多人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.coloradmin.cn/o/1602164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

【迅为iMX6Q】开发板 Linux version 6.6.3 SD卡 启动

开发环境 win10 64位 VMware Workstation Pro 16 ubuntu 20.04 【迅为imx6q】开发板&#xff0c; 2G DDR RAM linux-imx 下载 使用 NXP 官方提供的 linux-imx&#xff0c;代码地址为&#xff1a; https://github.com/nxp-imx/linux-imx 使用 git 下载 linux-imx&#xff…

磁盘管理和文件系统

一.磁盘基础 1.磁盘结构 &#xff08;1&#xff09;物理结构&#xff1a; 盘片&#xff1a;硬盘有多个盘片&#xff0c;每盘片2面 磁头&#xff1a;每面一个磁头 &#xff08;2&#xff09;硬盘的数据结构 扇区&#xff1a;盘片被分为多个扇形区域&#xff0c;每个扇区存…

有爱有乐有知识,还有《米小圈上学记》!

“读万卷书&#xff0c;不如行万里路”&#xff0c;说的是读再多的书&#xff0c;也比不上走过万水千山所得。可是又有几人能得尝山水之妙&#xff0c;大多被困于尘世中。我虽走过一些山水&#xff0c;但大多因生存困于一隅&#xff0c;不得随心而行。 然而&#xff0c;读书也…

实景三维技术在社区服务与管理领域的应用

随着科技的不断发展&#xff0c;实景三维技术已经成为了社区服务与管理领域的一项重要工具。实景三维技术可以通过高精度的三维建模技术&#xff0c;将现实世界中的场景、物体以及人物进行数字化重建&#xff0c;使得人们可以在计算机中实现对现实世界的全方位、多角度的观察和…

【重磅开源】一款可以生成SpringBoot+Vue代码的轻量级项目

基于SpringBootVue3开发的轻量级快速开发脚手架 &#x1f341;项目简介 一款通用的前、后端项目模板 一款快速开发管理系统的项目 一款可以生成SpringBootVue代码的项目 一款持续迭代的开源项目 一个程序员的心血合集 度过严寒&#xff0c;终有春日&#xff…

WEB前端-笔记

目录 一、字体 二、背景图片 三、显示方式 四、类型转换 五、相对定位 六、绝对定位 七、固定定位 八、Index 九、粘性定位 十、内边距 十一、外边距 十二、边框 十三、盒子尺寸计算问题 十四、清楚默认样式 十五、内容溢出 十六、外边距的尺寸与坍塌 十七、行…

Spring @Transactional 注解

官方文档&#xff1a;https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative/annotations.html#:~:textThe%20%40Transactional%20annotation%20is%20metadata,suspending%20any%20existing%20transaction%22). 推荐阅读&#xff1a;https:…

基于STM32的智能垃圾分类识别系统设计(论文)_kaic

摘 要 智能垃圾分类技术逐渐受到了政府的重视和支持&#xff0c;越来越多的城市开始推行垃圾分类政策。因此设计一款能够对垃圾进行识别并分类的控制系统具有一定的现实意义。本设计采用STM32单片机作为整个系统的控制核心&#xff0c;利用K210开发板作为图像识别控制系统&…

RT-thread信号量与互斥量

1,信号量 信号量是一种轻型的用于解决线程间同步问题的内核对象,线程可以获取或释放它,从而达到同步或互斥的目的。理解资源计数适合于线程间工作处理速度不匹配的场合;信号量在大于0时才能获取,在中断、线程中均可释放信号量。 为了体现使用信号量来达到线程间的同步,…

删除链表的倒数第n个节点【java版】

思路&#xff1a;要删除链表的倒数第n个节点&#xff0c;只需要找到倒数第n1个节点然后改变他的指针即可! 问题转换为&#xff1a;找到倒数第n1个节点? 假设要删除倒数第2个节点&#xff0c;只需要找到倒数第3个节点&#xff0c;问题是如何定位到这个节点 可见一个指针是不够…

【nodejs】使用express-generator快速搭建项目框架

文章目录 一、全局安装express-generator二、安装依赖三、启动项目四、修改文件便重启服务器1、全局安装nodemon2、修改 package.json 文件3、npm start 启动项目 一、全局安装express-generator npm install -g express-generator二、安装依赖 项目根目录打开终端&#xff0…

新手备战软考不要慌!这份软考全攻略请收下!

软考有哪些变化&#xff1f; 相信很多考生也关注到了&#xff0c;软考这两年进行了很多调整&#xff0c;软考这两年在多方面的形式上进行了一些调整。像2023年下半年开始&#xff0c;软考从以前的纸笔考试改成了机考。今年在考试科目的次数和时间安排上也进行了一些调整。 比…

久吾高科技股份有限将莅临2024第13届生物发酵展

参展企业介绍 江苏久吾高科技股份有限公司成立于1997年&#xff0c;是一家专注从事新材料研发与整体解决方案的高科技企业。2017年3月在深交所A股创业板上市。公司是首批认定的guojiaji高新技术企业、国家专精特新“小巨人”企业、国家制造业单项、中国膜行业陶瓷膜领域龙头企…

白帽工具箱:在windows上安装部署渗透测试演练系统DVWA-方法二

&#x1f31f;&#x1f30c; 欢迎来到知识与创意的殿堂 — 远见阁小民的世界&#xff01;&#x1f680; &#x1f31f;&#x1f9ed; 在这里&#xff0c;我们一起探索技术的奥秘&#xff0c;一起在知识的海洋中遨游。 &#x1f31f;&#x1f9ed; 在这里&#xff0c;每个错误都…

流程编排是如何实现解耦代码

为什么要使用流程流程编排 问题原因 在我们日常开发中&#xff0c;当我们接到一个复杂业务需求时&#xff0c;大部分开发同学都是通过面向过程编程代码&#xff0c;瀑布式编写代码风格&#xff0c;当新增新的需求时我们需要修改当前的方法&#xff0c;当需求变更很频繁代码的…

恶意不息上线时间/游戏价格/配置要求/加速器推荐

Moon Studios 联合创始人、技术总监 Gennadiy Korol 解释说&#xff1a;我们的目标是让战斗更有身临其境感一些、更加专注一些。而不是屏幕上的信息量多到爆炸&#xff0c;让人看不过来。我们要让玩家真正感受到角色的每一个动作。战斗是贴近的&#xff0c;是专注的。不是屏幕上…

Day:007(3) | Python爬虫:高效数据抓取的编程技术(scrapy框架使用)

Scrapy 保存数据案例-小说保存 spider import scrapyclass XiaoshuoSpiderSpider(scrapy.Spider):name xiaoshuo_spiderallowed_domains [zy200.com]url http://www.zy200.com/5/5943/start_urls [url 11667352.html]def parse(self, response):info response.xpath(&qu…

Linux第90步_异步通知实验

“异步通知”的核心就是信号&#xff0c;由“驱动设备”主动报告给“应用程序”的。 1、添加“EXTI3.c” #include "EXTI3.h" #include <linux/gpio.h> //使能gpio_request(),gpio_free(),gpio_direction_input(), //使能gpio_direction_output(),gpio_get_v…

浅谈Java IO流

Java中的IO流&#xff08;Input/Output streams&#xff09;是Java程序用来处理数据输入和输出的核心工具集。IO流抽象了数据流动的概念&#xff0c;允许Java程序与外部世界进行数据交换&#xff0c;无论是从文件、网络、键盘输入还是向屏幕、文件或网络发送数据。Java IO流按照…