【问题标题】:Count total number of group of blocks in 2D array?计算二维数组中的块组总数?
【发布时间】:2019-12-11 10:24:12
【问题描述】:

假设您给出了一个包含值(0 或 1)的二维数组。

计算给定数组中相邻 1 组的总数。

示例 1:
1, 0, 0
0, 0, 0
0, 0, 1

答案:2

解释:在上面的例子中,单个 1 的块也被认为是一组。


示例 2:
1, 1, 0, 1, 1, 0
0, 1, 0, 0, 0, 1
0, 1, 0, 1, 1, 0
0, 1, 1, 0, 0, 0

答:1

说明:在上面的例子中,一组 1 的块与至少一个 1 的块相邻。


我的解决方案:https://play.golang.org/p/nyw4lm6yrQ1

但是看起来,时间复杂度是O(n^2)

【问题讨论】:

  • 您需要检查每个单元格至少一次,并且已经是宽度*高度,有什么问题?
  • 看起来像洪水填充算法。
  • @juvian 感谢您的解释。我已经尝试过了,但是你有没有最好的优化解决方案来实现这个?
  • @WillemVanOnsem 是一位面试官问的。
  • 采用类似 DFS(深度优先搜索)的方法。

标签: algorithm go optimization multidimensional-array data-structures


【解决方案1】:

其著名的数岛问题。 您可以通过保留已访问单元格的布尔矩阵来执行 dfs 来轻松解决此问题。

class Graph: 

    def __init__(self, row, col, g): 
        self.ROW = row 
        self.COL = col 
        self.graph = g 

# to check validity of cell
    def isSafe(self, i, j, visited): 
        return (i >= 0 and i < self.ROW and 
                j >= 0 and j < self.COL and 
                not visited[i][j] and self.graph[i][j]) 


    def DFS(self, i, j, visited):

        row = [-1, -1, -1,  0, 0,  1, 1, 1]; 
        col = [-1,  0,  1, -1, 1, -1, 0, 1]; 


        visited[i][j] = True

        # check all 8 neighbours and mark them visited
        # as they will be part of group
        for k in range(8): 
            if self.isSafe(i + row[k], j + col[k], visited): 
                self.DFS(i + row[k], j + col[k], visited) 


    def group(self): 

        visited = [[False for j in range(self.COL)]for i in range(self.ROW)] 

        count = 0
        for i in range(self.ROW): 
            for j in range(self.COL): 
                # traverse not visited cell
                if visited[i][j] == False and self.graph[i][j] == 1: 
                    self.DFS(i, j, visited) 
                    count += 1

        return count

`

g = [[1, 1, 0, 0, 0], 
    [0, 1, 0, 0, 1], 
    [1, 0, 0, 1, 1], 
    [0, 0, 0, 0, 0], 
    [1, 0, 1, 0, 1]]
graphe = graph(len(g),len(g[0]),g)
print(graphe.group())

【讨论】:

  • 你也可以借助不相交的集合数据结构来解决这个问题。关于时间复杂度,因此它将是 O(row*Col),因为我们必须一次访问每个单元格,因此无法进一步降低。
猜你喜欢
  • 1970-01-01
  • 2012-07-23
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2017-07-16
  • 1970-01-01
  • 2021-02-14
相关资源
最近更新 更多