Python算法题集_环形链表

news2024/11/19 7:35:18

 Python算法题集_环形链表

  • 题234:环形链表
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【集合检索】
    • 2) 改进版一【字典检测】
    • 3) 改进版二【双指针】
  • 4. 最优算法

本文为Python算法题集之一的代码示例

题234:环形链表

1. 示例说明

  • 给你一个链表的头节点 head ,判断链表中是否有环。

    如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

    如果链表中存在环 ,则返回 true 。 否则,返回 false

    示例 1:

    img

  输入:head = [3,2,0,-4], pos = 1
输出:true
  解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

img

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

img

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

  • 链表中节点的数目范围是 [0, 104]
  • -105 <= Node.val <= 105
  • pos-1 或者链表中的一个 有效索引

**进阶:**你能用 O(1)(即,常量)内存解决此问题吗?


2. 题目解析

- 题意分解

  1. 本题为链表的值查重
  2. 本题的主要计算有2处,1是链表遍历,2是值比较
  3. 基本的解法是单层循环,必须读取链表数据后进行检测,所以基本的时间算法复杂度为O(n)

- 优化思路

  1. 通常优化:减少循环层次

  2. 通常优化:增加分支,减少计算集

  3. 通常优化:采用内置算法来提升计算速度

  4. 分析题目特点,分析最优解

    1. 链表需要遍历中进行值检查,为提高检索速度,可以采用哈希检索,采用setdict等数据结构

    2. 空间复杂度为O(1)的算法,一般是需要用到快慢双指针


- 测量工具

  • 本地化测试说明:LeetCode网站测试运行时数据波动很大,因此需要本地化测试解决这个问题
  • CheckFuncPerf(本地化函数用时和内存占用测试模块)已上传到CSDN,地址:Python算法题集_检测函数用时和内存占用的模块
  • 本题很难超时,本地化超时测试用例自己生成,详见【最优算法章节】

3. 代码展开

1) 标准求解【集合检索】

采用集合set进行值检索

性能优良,超过88在这里插入图片描述

import CheckFuncPerf as cfp

def hasCycle_base(head):
 set_checked = set()  
 while head: 
     if head in set_checked:
         return True
     set_checked.add(head)  
     head = head.next  
 return False

result = cfp.getTimeMemoryStr(hasCycle_base, head1)
print(result['msg'], '执行结果 = {}'.format(result['result']))

# 运行结果
函数 hasCycle_base 的运行时间为 27.01 ms;内存使用量为 996.00 KB 执行结果 = True

2) 改进版一【字典检测】

采用字典dict进行值检索,由于字典分配内存远大于集合,因此哈希检索的效率要低一些

马马虎虎,超过64%在这里插入图片描述

import CheckFuncPerf as cfp

def hasCycle_ext1(head):
 dict_checked = {} 
 while head:  
     dict_checked[head] = dict_checked.get(head, 0)
     if dict_checked[head] == 1:
         return True
     dict_checked[head] = 1
     head = head.next 
 return False

result = cfp.getTimeMemoryStr(hasCycle_ext1, head1)
print(result['msg'], '执行结果 = {}'.format(result['result']))

# 运行结果
函数 hasCycle_ext1 的运行时间为 58.00 ms;内存使用量为 128.00 KB 执行结果 = True

3) 改进版二【双指针】

没有很多内存分配的事,空间复杂度好的算法,时间复杂度也很好
表现优异,超越95%在这里插入图片描述

import CheckFuncPerf as cfp

def hasCycle_ext2(head):
 slownode , fastnode = head, head
 while fastnode and fastnode.next:
     slownode = slownode.next
     fastnode = fastnode.next.next
     if slownode == fastnode:
         break
 if fastnode and fastnode.next:
     while head != slownode:
         head = head.next
         slownode = slownode.next
     return True
 else:
     return False
 
result = cfp.getTimeMemoryStr(hasCycle_ext2, head1)
print(result['msg'], '执行结果 = {}'.format(result['result']))

# 运行结果
函数 hasCycle_ext2 的运行时间为 30.01 ms;内存使用量为 0.00 KB 执行结果 = True

4. 最优算法

根据本地日志分析,最优算法为第1种hasCycle_base

# 超时测试
nums = [x for x in range(200000)]
def generateOneLinkedList(data):
    head = ListNode(-100)
    iPos = 0
    current_node = head
    for num in data:
        iPos += 1
        if iPos == 190000:
            CycleNode = new_node
        new_node = ListNode(num)
        current_node.next = new_node
        current_node = new_node
    new_node.next = CycleNode
    return head.next, new_node
head1, tail1 = generateOneLinkedList(nums)

result = cfp.getTimeMemoryStr(hasCycle_base, head1)
print(result['msg'], '执行结果 = {}'.format(result['result']))

# 算法本地速度实测比较
函数 hasCycle_base 的运行时间为 27.01 ms;内存使用量为 996.00 KB 执行结果 = True
函数 hasCycle_ext1 的运行时间为 58.00 ms;内存使用量为 128.00 KB 执行结果 = True
函数 hasCycle_ext2 的运行时间为 30.01 ms;内存使用量为 0.00 KB 执行结果 = True

一日练,一日功,一日不练十日空

may the odds be ever in your favor ~

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

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

相关文章

掌握CSS网格函数fit-content()的妙用

CSS网格布局是一种强大的布局系统&#xff0c;它提供了灵活的网格化设计能力。其中&#xff0c;fit-content()函数是一项重要的功能&#xff0c;它可以帮助我们在网格容器中自动调整网格项的尺寸。本文将详细讲解fit-content()函数的使用方法及其常见应用场景&#xff0c;助你掌…

2月4日作业

1.请编程实现双向链表的头插&#xff0c;头删、尾插、尾删 头插&#xff1a; 尾插&#xff1a; 头删&#xff1a; 尾删&#xff1a; 2.请编程实现双向链表按任意位置插入、删除、修改、查找 插入&#xff1a; 删除&#xff1a; 查找&#xff1a; 修改&#xff1a; 头文件&am…

Golang 学习(二)进阶使用

二、进阶使用 性能提升——协程 GoRoutine go f();一个 Go 线程上&#xff0c;可以起多个协程&#xff08;有独立的栈空间、共享程序堆空间、调度由用户控制&#xff09;主线程是一个物理线程&#xff0c;直接作用在 cpu 上的。是重量级的&#xff0c;非常耗费 cpu 资源。协…

msvcp120.dll丢失如何解决/找不到msvcp120.dll的5种有效的解决方法

在计算机系统运行过程中&#xff0c;如果遇到“找不到msvcp120.dll”的提示信息&#xff0c;这代表了何种具体状况呢&#xff1f;首先&#xff0c;我们需要明确msvcp120.dll文件的重要性。msvcp120.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;这是一…

Java入门之JavaSe(韩顺平p1-p?)

学习背景&#xff1a; 本科搞过一段ACM、研究生搞了一篇B会后&#xff0c;本人在研二要学Java找工作啦~~&#xff08;宇宙尽头是Java&#xff1f;&#xff09;爪洼纯小白入门&#xff0c;C只会STL、python只会基础Pytorch、golang参与了一个Web后端项目&#xff0c;可以说项目小…

数据库学习笔记2024/2/5

2. SQL 全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了 一套操作关系型数据库统一标准 2.1 SQL通用语法 在学习具体的SQL语句之前&#xff0c;先来了解一下SQL语言的通用语法。 1). SQL语句可以单行或多行书写&…

查大数据检测到风险等级太高是怎么回事?

随着金融风控越来越多元化&#xff0c;大数据作为新兴的技术被运用到贷前风控中去了&#xff0c;不少人也了解过自己的大数据&#xff0c;但是由于相关知识不足&#xff0c;看不懂报告&#xff0c;在常见的问题中&#xff0c;大数据检测到风险等级太高是怎么回事呢?小易大数据…

支持534种语言,开源大语言模型MaLA-500

无论是开源的LLaMA 2还是闭源的GPT系列模型&#xff0c;功能虽然很强大&#xff0c;但对语言的支持和扩展比较差&#xff0c;例如&#xff0c;二者都是以英语为主的大模型。 为了提升大模型语言的多元化&#xff0c;慕尼黑大学、赫尔辛基大学等研究人员联合开源了&#xff0c;…

第十四篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像特征提取与描述

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文目录前言一、OpenCV图像特征提取与描述介绍二、OpenCV图像特征提取与描述初步示例代码三、扩展思路介绍四、特征点筛选和匹配优化示例代码五、多尺度特征提取示例代码六、非局部特征描述子示例代码…

【数据结构与算法】之排序系列-20240205

这里写目录标题 一、1346. 检查整数及其两倍数是否存在二、1365. 有多少小于当前数字的数字三、1460. 通过翻转子数组使两个数组相等四、1491. 去掉最低工资和最高工资后的工资平均值五、1502. 判断能否形成等差数列 一、1346. 检查整数及其两倍数是否存在 简单 给你一个整数数…

工业笔记本丨行业三防笔记本丨亿道加固笔记本定制丨极端温度优势

工业笔记本是专为在恶劣环境条件下工作而设计的高度耐用的计算机设备。与传统消费者级笔记本电脑相比&#xff0c;工业笔记本在极端温度下展现出了许多优势。本文将探讨工业笔记本在极端温度环境中的表现&#xff0c;并介绍其优势。 耐高温性能: 工业笔记本具有更高的耐高温性…

CodeMeter强化了ETM WinCC 开放架构平台的许可与安全保护

在面对日益复杂的网络安全威胁时&#xff0c;ETM professional control采取了前瞻性的措施&#xff0c;选择了业界领先的威步CodeMeter技术&#xff0c;以保护其标志性的WinCC开放架构平台。这一选择不仅体现了ETM对安全的高度重视&#xff0c;也标志着其在保障关键基础设施运营…

见龙在田,预防性保护措施让文物传承千年

一、“见龙在田——山西出土龙文物展” “见龙在田——山西出土龙文物展”以十二生肖龙为线索&#xff0c;在山西省考古研究院&#xff08;山西考古博物馆&#xff09;揭幕&#xff0c;深入展示了中国优秀传统文化的悠久历史。展览汇聚了130多件珍贵历史文物。从新石器时代到汉…

2.0 Zookeeper 安装配置

Linux 安装 zookeeper 下载地址为: Apache ZooKeeper。 选择一稳定版本&#xff0c;本教程使用的 release 版本为3.4.14&#xff0c;下载并安装。 打开网址 https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz&#xff0c;看到如下界…

Linux中有名管道和无名管道

无名管道基础 进程间通信介绍 常用通信方式 无名管道&#xff08;pipe&#xff09; 有名管道 &#xff08;fifo&#xff09; 信号&#xff08;signal&#xff09; 共享内存(mmap) 套接字&#xff08;socket&#xff09;过时的IPC通信方式 System V IPC 共享内存&#xff08;sh…

机器学习---概率图模型(隐马尔可夫模型、马尔可夫随机场、条件随机场)

1. 隐马尔可夫模型 机器学习最重要的任务是根据已观察到的证据&#xff08;例如训练样本&#xff09;对感兴趣的未知变量&#xff08;例如类别标 记&#xff09;进行估计和推测。概率模型&#xff08;probabilistic model&#xff09;提供了一种描述框架&#xff0c;将描述任…

【Qt Design】界面介绍

文章目录 前言Widget Box&#xff08;工具箱&#xff09;对象查看器Qt Design属性编译器sizePolicy内容 信号/槽编辑器资源浏览器ui文件 前言 Widget Box&#xff08;工具箱&#xff09; 提供很多控件 对象查看器 对象查看区域&#xff0c;可以查看主窗口放置对象的列表 …

HTTP相关问题

目录 1.从输入URL到页面展示到底发生了什么&#xff1f; 2.HTTP状态码有哪些&#xff1f; 2.1 2XX(成功状态码) 2.2 3XX(重定向状态码) 2.3 4XX(客户端错误状态码) 2.4 5XX(服务端错误状态码) 3.HTTP 请求头中常见的字段有哪些&#xff1f; 4.HTTP和HTTPS有什么区别&…

CSS:水平垂直居中

水平垂直居中效果如下&#xff1a; HTML: <div class"parent"><div class"child"></div> </div>公共的 CSS&#xff1a; .parent {width: 300px;height: 300px;background-color:#d0e4fe; }.child {width: 100px;height: 100px…

第二篇:MySQL安装与配置(基于小皮面板(phpstudy))

在第一篇中介绍了数据库的相关概念&#xff0c;了解到SQL是用来操作数据库管理系统的语言&#xff0c;因此要学习数据库技术&#xff0c;数据库管理系统的配备是必不可少的&#xff01; 并且出于流行性与实惠性的双考量而选择MySQL这款数据库管理系统软件 一&#xff0c;工具推…