阜新网站开发公司房产信息网显示已备案
web/
2025/9/27 2:33:45/
文章来源:
阜新网站开发公司,房产信息网显示已备案,商城网站架构,地图网站抓取Python算法题集_环形链表 题234#xff1a;环形链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【集合检索】2) 改进版一【字典检测】3) 改进版二【双指针】 4. 最优算法 本文为Python算法题集之一的代码示例
题234#xff1a;环形链表
… Python算法题集_环形链表 题234环形链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【集合检索】2) 改进版一【字典检测】3) 改进版二【双指针】 4. 最优算法 本文为Python算法题集之一的代码示例
题234环形链表
1. 示例说明 给你一个链表的头节点 head 判断链表中是否有环。 如果链表中有某个节点可以通过连续跟踪 next 指针再次到达则链表中存在环。 为了表示给定链表中的环评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置索引从 0 开始。注意pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。 如果链表中存在环 则返回 true 。 否则返回 false 。 示例 1 输入head [3,2,0,-4], pos 1
输出true解释链表中有一个环其尾部连接到第二个节点。示例 2 输入head [1,2], pos 0
输出true
解释链表中有一个环其尾部连接到第一个节点。示例 3 输入head [1], pos -1
输出false
解释链表中没有环。提示
链表中节点的数目范围是 [0, 104]-105 Node.val 105pos 为 -1 或者链表中的一个 有效索引 。
**进阶**你能用 O(1)即常量内存解决此问题吗 2. 题目解析
- 题意分解
本题为链表的值查重本题的主要计算有2处1是链表遍历2是值比较基本的解法是单层循环必须读取链表数据后进行检测所以基本的时间算法复杂度为O(n
- 优化思路 通常优化减少循环层次 通常优化增加分支减少计算集 通常优化采用内置算法来提升计算速度 分析题目特点分析最优解 链表需要遍历中进行值检查为提高检索速度可以采用哈希检索采用set、dict等数据结构 空间复杂度为O(1)的算法一般是需要用到快慢双指针 - 测量工具
本地化测试说明LeetCode网站测试运行时数据波动很大因此需要本地化测试解决这个问题CheckFuncPerf本地化函数用时和内存占用测试模块已上传到CSDN地址Python算法题集_检测函数用时和内存占用的模块本题很难超时本地化超时测试用例自己生成详见【最优算法章节】 3. 代码展开
1) 标准求解【集合检索】
采用集合set进行值检索
性能优良超过88
import CheckFuncPerf as cfpdef hasCycle_base(head):set_checked set() while head: if head in set_checked:return Trueset_checked.add(head) head head.next return Falseresult cfp.getTimeMemoryStr(hasCycle_base, head1)
print(result[msg], 执行结果 {}.format(result[result]))# 运行结果
函数 hasCycle_base 的运行时间为 27.01 ms内存使用量为 996.00 KB 执行结果 True2) 改进版一【字典检测】
采用字典dict进行值检索由于字典分配内存远大于集合因此哈希检索的效率要低一些
马马虎虎超过64%
import CheckFuncPerf as cfpdef hasCycle_ext1(head):dict_checked {} while head: dict_checked[head] dict_checked.get(head, 0)if dict_checked[head] 1:return Truedict_checked[head] 1head head.next return Falseresult cfp.getTimeMemoryStr(hasCycle_ext1, head1)
print(result[msg], 执行结果 {}.format(result[result]))# 运行结果
函数 hasCycle_ext1 的运行时间为 58.00 ms内存使用量为 128.00 KB 执行结果 True3) 改进版二【双指针】
没有很多内存分配的事空间复杂度好的算法时间复杂度也很好 表现优异超越95%
import CheckFuncPerf as cfpdef hasCycle_ext2(head):slownode , fastnode head, headwhile fastnode and fastnode.next:slownode slownode.nextfastnode fastnode.next.nextif slownode fastnode:breakif fastnode and fastnode.next:while head ! slownode:head head.nextslownode slownode.nextreturn Trueelse:return Falseresult cfp.getTimeMemoryStr(hasCycle_ext2, head1)
print(result[msg], 执行结果 {}.format(result[result]))# 运行结果
函数 hasCycle_ext2 的运行时间为 30.01 ms内存使用量为 0.00 KB 执行结果 True4. 最优算法
根据本地日志分析最优算法为第1种hasCycle_base
# 超时测试
nums [x for x in range(200000)]
def generateOneLinkedList(data):head ListNode(-100)iPos 0current_node headfor num in data:iPos 1if iPos 190000:CycleNode new_nodenew_node ListNode(num)current_node.next new_nodecurrent_node new_nodenew_node.next CycleNodereturn 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.mzph.cn/web/80975.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!