编程新手求助:Python代码在URI评测系统超时问题
解决URI评测系统代码超时问题的优化方案
嘿,作为编程新手遇到超时问题太正常了,我来帮你拆解下问题根源,再给你几个高效的优化方案!
原代码的瓶颈分析
你的代码功能完全没问题,但效率拖了后腿,才导致超时。核心问题出在这一行:
if coords.count(coords[i])>1:
每次调用coords.count()都会完整遍历一遍整个列表去统计当前元素的出现次数。假设你有n个坐标,这个操作的时间复杂度是O(n),再加上外层遍历整个列表的循环,整体时间复杂度就变成了O(n²)。当输入数据量稍大(比如几千甚至上万条坐标)时,这种高复杂度的代码很容易触发URI的时间限制。
优化思路:用集合降低时间复杂度
我们可以利用Python的集合(set)来彻底解决效率问题。集合的成员检查(in操作)是基于哈希表实现的,平均时间复杂度是O(1)——简单说就是查一次几乎不花时间。我们只需要遍历一次输入,同时记录已经见过的坐标,一旦发现重复就直接标记,甚至可以提前终止循环,整体时间复杂度降到O(n),效率会提升好几倍。
优化后的代码
版本1:边读边检查(节省内存)
这个版本不需要先把所有坐标存到列表里,读到一个就检查一个,发现重复可以直接跳出循环,还能节省内存:
cont = 0 cont_register = int(input()) seen_coords = set() for _ in range(cont_register): coord = input() if coord in seen_coords: cont = 1 break # 发现重复后无需继续处理剩余输入 seen_coords.add(coord) print(cont)
版本2:快速读取大量输入(应对超大数据量)
如果输入的坐标数量特别多,input()函数的速度可能不够快,这时可以用sys.stdin一次性读取所有输入再处理,速度会更快:
import sys cont = 0 all_lines = sys.stdin.read().splitlines() cont_register = int(all_lines[0]) seen_coords = set() for line in all_lines[1:cont_register + 1]: if line in seen_coords: cont = 1 break seen_coords.add(line) print(cont)
额外小提示
原代码里的else: cont=cont是完全多余的,可以直接删掉,不过这不是导致超时的核心原因啦。
内容的提问来源于stack exchange,提问作者Lucas Motta
相关产品推荐
相关产品推荐

