我正在从LeetCode的岛周边问题,虽然我有一个工作解决方案,它只通过5817/5833测试用例。我认为这是成功的,但显然它不足以处理这些非常庞大的“岛屿”,如果我不明白是什么导致了性能问题,它会唠叨我。对于那些不熟悉“岛周边”问题的人,这里有一个指向LeetCode页面的链接。岛周长算法太慢
我已经解决Python中的问题与语言refamiliarize自己,希望教我一些新花样,所以它可能只是什么我做的低效,有人可以帮助我更好地。任何人都可以在效率方面看到以下算法的明显问题吗?
def islandPerimeter(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
start = self.locateIsland(grid)
return self.islandHelp(grid, start)
def islandHelp(self, grid, start):
# get the perimeter of this position
p = self.getPerimeter(grid, start)
# mark this position as visited so we don't count it repeatedly
grid[start[0]][start[1]] = 2
# offsets to current positions to find land to the sides
sides = [[-1, 0], [0, 1], [1, 0], [0, -1]]
for side in sides:
newPos = [(start[0] + side[0]), (start[1] + side[1])]
if ((newPos[0] in range(len(grid))) and
(newPos[1] in range(len(grid[newPos[0]]))) and
(grid[newPos[0]][newPos[1]] == 1)):
# recursively find perimeter of connected land
p += self.islandHelp(grid, newPos)
return p
def getPerimeter(self, grid, pos):
p = 0
# offsets to find the neighboring positions
sides = [[-1, 0], [0, 1], [1, 0], [0, -1]]
for side in sides:
if (((pos[0] + side[0]) in range(len(grid))) and
((pos[1] + side[1]) in range(len(grid[pos[0] + side[0]])))):
if (grid[pos[0] + side[0]][pos[1] + side[1]] == 0):
# in bounds of grid, but not a land mass, add to perimeter
p += 1
else:
# out of bounds means edge of grid, add to perimeter
p += 1
return p
def locateIsland(self, grid):
# iterate through the grid to find a 1 and use that as start position
for r in range(len(grid)):
for c in range(len(grid[r])):
if (grid[r][c] == 1):
return (r, c)
return (-1, -1)
试着做没有递归,回溯和所有。把事情简单化。 –
给定的链接不会导致对问题的描述。请提供。可能是轮廓跟踪? http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/alg.html –