当我解决自我交叉的问题时,我遇到了this问题。这就像蛇游戏。
给定x = [2,1,1,2],我们从0开始,然后我们上升2,左转1,右转1,然后下2。目标是计算是否它会自我交叉还是不交叉。由于给定的步骤总是整数,我考虑使用矩阵,每当它通过一个点时,我将点设置为1.像这样我可以检查点是否已被访问过。
我认为通过这种方式,python所做的所有内存只是矩阵的赋值。这就是为什么我不理解输入x何时是巨大的,为什么它说:内存超出限制。对我来说,我认为记忆与之前启动的矩阵相同。
如果有人可以提供帮助,我会很高兴。
class Solution(object):
def isSelfCrossing(self, x):
"""
:type x: List[int]
:rtype: bool
"""
m = [[0 for j in xrange(1000)] for j in xrange(1000)]
m[0][0] = 1
a,b = 0,0
flag = 0
for i in x:
flag = (flag + 1) % 4
if flag == 1:
for temp in xrange(1,i+1):
b += 1
if m[a][b] != 0:
return True
else: m[a][b] = 1
elif flag == 2:
for temp in xrange(1,i+1):
a -= 1
if m[a][b] != 0:
return True
else: m[a][b] = 1
elif flag == 3:
for temp in xrange(1,i+1):
b -= 1
if m[a][b] != 0:
return True
else: m[a][b] = 1
else:
for temp in xrange(1,i+1):
a += 1
if m[a][b] != 0:
return True
else: m[a][b] = 1
return False
答案 0 :(得分:0)
多么巨大" x"可能?如果" x"是不是很大,您的代码是否成功运行?
假设" x"真的很大,它可能与你的" m"初始化是打破骆驼背部的稻草。换句话说,你的" x" (以及其他一些内存分配)可能会消耗几乎所有允许的进程内存分配,并且" m"初始化超过限制。
答案 1 :(得分:0)
在Python中使用列表作为布尔矩阵很少有意义。尝试在set
中存储整数对并替换
m = ... # with m = set()
m[a][b] != 0 # with (a, b) in m
m[a][b] = 1 # with m.add((a, b))
或者,您可以使用与bytearray
和index it相同数量的元素m
创建展平a * 1000 + b
。但是,这可能会导致细微的索引错误,所以我强烈建议先尝试set
。