Python数据结构【二】查找

前言

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

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

  • 一、查找是什么

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

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

    较为官方的描述

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

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

    二、线性查找

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

    上代码!

    def find_num(li,num):"""li: 列表num: 要找的数"""for i in range(len(li)):if li[i]==nums:return ireturn 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:continueelif 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 = midelse: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.mzph.cn/news/823147.shtml

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

相关文章

C++奇迹之旅:构造函数

文章目录 &#x1f4dd;类的6个默认成员函数&#x1f320; 构造函数&#x1f309; 概念&#x1f309;特性&#x1f309;三种默认构造函数 &#x1f6a9;总结 &#x1f4dd;类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&am…

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

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

Nginx内存池相关源码剖析(一)总览

剖析nginx的内存池源码&#xff0c;讲解原理实现以及该内存池设计的应用场景 介绍 Nginx内存池是Nginx为了优化内存管理而引入的一种机制。在Nginx中&#xff0c;每个层级&#xff08;如模板、TCP连接、HTTP请求等&#xff09;都会创建一个内存池进行内存管理。当这些层级的…

Linux下redis的安装过程与配置详细教程【5.0.5为例子】

Linux下redis的安装过程与配置方法【5.0.5为例子】 下载redis redis下载地址 https://download.redis.io/releases/ 也可以自行去官网下载 提示&#xff1a;此处安装的为redis-5.05的版本 上传redis安装包(我的安装目录为/data/tool/redis-5.0.5) 创建目录/data/local/tool并…

Day20-【Java SE高级】单元测试 反射 注解 动态代理

一、单元测试 就是针对最小的功能单元(方法)&#xff0c;编写测试代码对其进行正确性测试。 1. 咱们之前是如何进行单元测试的?有啥问题? 只能在main方法编写测试代码&#xff0c;去调用其他方法进行测试。无法实现自动化测试&#xff0c;一个方法测试失败&#xff0c;可能…

Day 23 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇

修剪二叉搜索树 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点&#xff0c;所以结果应当返回修剪好的二叉搜索树的新的根节点。 ​ 最直接的想法&#xff0…

最强解释!Python 包的依赖管理,有解了!

之前一直比较抵触用 Python &#xff0c;很大一部分原因是觉得 Python 项目的环境管理比较混乱。Node.js 有 Npm 包管理工具&#xff0c;通过 package.json 配置项目依赖&#xff0c;最多再通过 nvm 来进行环境切换&#xff1b;Java 有 Maven Gradle 来进行包管理和项目依赖配置…

今天刷两题(day2)

题目一&#xff1a;最长公共前缀 题目描述&#xff1a; 给你一个大小为 n的字符串数组 strs &#xff0c;其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀&#xff0c;返回这个公共前缀。输入输出描述&#xff1a; 输入&#xff1a;"abca","…

MyBatis 源码分析 - SQL 的执行过程

MyBatis 源码分析 - SQL 的执行过程 * 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程。该过程本身比较复杂&#xff0c;牵涉到的技术点比较多。包括但不限于 Mapper 接口代理类的生成、接口方法的解析、SQL 语句的解析、运行时参数的绑定、查询结果自动映射、延…

C++ 秋招必知必会(数据结构与算法:下)

20. 二叉树的定义与操作 二叉树&#xff08;binary tree&#xff09;是一种非线性数据结构&#xff0c;代表着祖先与后代之间的派生关系&#xff0c;体现着“一分为二”的分治逻辑 与链表类似&#xff0c;二叉树的基本单元是节点&#xff0c;每个节点包含&#xff1a;值、左子…

MYSQL5.7详细安装步骤

MYSQL5.7详细安装步骤&#xff1a; 0、更换yum源 1、打开 mirrors.aliyun.com&#xff0c;选择centos的系统&#xff0c;点击帮助 2、执行命令&#xff1a;yum install wget -y 3、改变某些文件的名称 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base…

储能的全生命周期成本即平准化度电成本的计算方法及python实践

1. 平准化度电成本&#xff08;LCOE&#xff09;是一种衡量电力项目经济性的指标 LCOE&#xff08;Levelized Cost of Energy,&#xff09;的概念最早由美国国家可再生能源实验室&#xff08;NREL&#xff09;在1995年提出&#xff0c;它是通过将一个项目生命周期内的所有成本…

黑马头条项目结构

微服务架构具有许多优点&#xff0c;其中一些主要优点包括&#xff1a; 松耦合性&#xff1a;每个微服务都是独立的&#xff0c;可以独立部署、独立扩展和独立更新&#xff0c;这种松耦合性使得系统更加灵活&#xff0c;易于维护和演化。 技术多样性&#xff1a;由于每个微服务…

基于springboot实现知识管理系统项目【项目源码+论文说明】

基于springboot实现知识管理系统演示 摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生作业交流形式的网站。本文介绍了知识管理系统的开发全过程。通过分析企业对于知识管理系统的需求&#xff0c;创建了…

2024年4月13日美团春招实习试题【第四题:乘积因子数】-题目+题解+在线评测【二分】

2024年4月13日美团春招实习试题【第四题:乘积因子数】-题目题解在线评测【二分】 题目描述&#xff1a;输入描述输出描述样例 解题思路一&#xff1a;python解题思路二&#xff1a;c解题思路三&#xff1a;0 题目描述&#xff1a; 塔子哥拿到了一个数组&#xff0c;她有q次查询…

HTTP/1.1特性总结

优点 【简单&#xff0c;灵活和易于扩展&#xff0c;应用广泛和跨平台】 1.简单&#xff1a; http基本的报文格式就是headerbody&#xff0c;头部信息也是key-value简单的文本形式&#xff0c;易于理解&#xff0c;降低了学习和使用的门槛 2.灵活和易于扩展&#xff1a; &…

Redis 配置与使用 (Linux 虚拟机Windows客户端)

Centos7 安装Redis详细教程 - JcongJason - 博客园 (cnblogs.com) 安装 下载redis安装包并解压 # 下载&#xff0c;我是在root下执行的下载&#xff0c;所以我的下载目录为&#xff1a;/root/redis-5.0.5&#xff0c;这里按照自己的实际情况调整 wget https://download.redi…

Methoxy PEG Glutaric Acid可以改善物质的溶解性、稳定性和生物相容性

【试剂详情】 英文名称 mPEG-GA&#xff0c;mPEG-Glutaric Acid&#xff0c; Methoxy PEG GA&#xff0c; Methoxy PEG Glutaric Acid 中文名称 聚乙二醇单甲醚戊二酸&#xff0c; 甲氧基-聚乙二醇-戊二酸 外观性状 由分子量决定&#xff0c;固体或液体 分子量 400&…

浅谈Java的synchronized 锁以及synchronized 的锁升级

在Java中&#xff0c;synchronized关键字用于实现线程间的同步&#xff0c;确保同一时刻只有一个线程能够访问被同步的代码块或方法。当一个线程获得synchronized锁定后&#xff0c;其他试图访问同一锁的线程将被阻塞&#xff0c;直到锁被释放。 synchronized锁有两种基本形式…

为什么说六西格玛培训公司是企业问题的“终结者”

随着六西格玛管理方法的走红&#xff0c;六西格玛培训公司应运而生&#xff0c;致力于帮助企业解决各种核心问题&#xff0c;实现业绩的飞跃。那么&#xff0c;六西格玛培训公司究竟能为企业解决哪些问题&#xff1f;又为什么说六西格玛培训公司是企业问题的“终结者”呢&#…