列表

详情


2852. 所有单元格的远离程度之和

给定一个下标从 0 开始的大小为 n * n 的矩阵 grid,其中每个单元格的值 grid[i][j] 要么是 正整数,要么是表示阻塞单元格的值 -1

你可以从一个非阻塞单元格移动到与其共享边的任何非阻塞单元格。

对于任何单元格 (i, j),我们定义其 远离程度 R[i][j] 如下:

返回所有单元格的 R[i][j] 之和。

 

示例 1:

输入:grid = [[-1,1,-1],[5,-1,4],[-1,3,-1]]
输出:39
解释:在上面的图片中,有四个矩阵。左上角的矩阵是题目给定矩阵的初始值。被阻塞的单元格是黑色的,其他单元格的值与输入相同。在右上方的网格中,可以看到所有单元格的值也就是 R[i][j] 的值。答案是它们的和。即:0 + 12 + 0 + 8 + 0 + 9 + 0 + 10 + 0 = 39。
在上图左下角的矩阵,计算 R[0][1] (目标单元格为绿色)。我们应该将单元格 (0,1) 无法到达的单元格的值相加。这些单元格在这个矩阵中是黄色的。所以 R[0][1] = 5 + 4 + 3 = 12。
在上图右下角的矩阵,计算 R[1][2] (目标单元格为绿色)。我们应该把单元格 (1,2) 无法到达的单元格的值相加。这些单元格在这个矩阵中是黄色的。所以 R[1][2] = 1 + 5 + 3 = 9。

示例 2:

输入:grid = [[-1,3,4],[-1,-1,-1],[3,-1,-1]]
输出:13
解释:在上面的图片中,有四个矩阵。左上角的矩阵是给定矩阵的初始值。被阻塞的单元格是黑色的,其他单元格的值与输入相同。在右上方的网格中,可以看到所有单元格的值也就是 R[i][j] 的值。答案是它们的和。即:3 + 3 + 0 + 0 + 0 + 0 + 7 + 0 + 0 = 13。
在上图左下角的矩阵上,计算 R[0][2] (目标单元格为绿色)。将单元格 (0,2) 无法到达的单元格的值相加。这个单元格在这个矩阵中是黄色的。所以 R[0][2] = 3。
在上图右下角的矩阵上,计算 R[2][0] (目标单元格为绿色)。将单元格 (2,0) 无法到达的单元格的值相加,这些单元格在这个矩阵中是黄色的。所以 R[2][0] = 3 + 4 = 7。

示例 3:

输入:grid = [[1]]
输出:0
解释:因为除了 (0,0) 没有其他单元格,所以 R[0][0] 等于 0。所以所有单元格的和是 0。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: long long sumRemoteness(vector<vector<int>>& grid) { } };

python3 解法, 执行用时: 924 ms, 内存消耗: 38.3 MB, 提交时间: 2023-10-20 19:35:51

class Solution:
    def sumRemoteness(self, grid: List[List[int]]) -> int:
        def find(x):
            if dc[x] != x: dc[x] = find(dc[x])
            return dc[x]        
        m, n, POS, sm, res = len(grid), len(grid[0]), ((0, -1), (-1, 0)), 0, 0
        has, dc = [-1] * (m*n), [-1] * (m*n)
        for i in range(m):
            for j in range(n):
                if grid[i][j] > 0:
                    sm, x = sm + grid[i][j], i*n+j
                    dc[x], has[x] = x, grid[i][j]
                    for dx, dy in POS:
                        nx, ny = i + dx, j + dy
                        if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] > 0:
                            y = find(nx*n+ny)
                            if x != y: dc[y], has[x] = x, has[x] + has[y]
        for i in range(m*n): res += (sm - has[find(i)]) if grid[i//n][i%n] > 0 else 0
        return res

python3 解法, 执行用时: 824 ms, 内存消耗: 46.1 MB, 提交时间: 2023-10-20 19:35:41

from collections import deque

class Solution:
    def sumRemoteness(self, grid: List[List[int]]) -> int:
        row = len(grid)
        col = len(grid[0])
        total_visited = set()
        directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
        total_sum = 0
        lst = []
        for i in range(row):
            for j in range(col):
                if grid[i][j] > -1 and (i, j) not in total_visited:
                    queue = deque([(i, j)])
                    visited = {(i, j)}
                    while queue:
                        cur_i, cur_j = queue.popleft()
                        for di, dj in directions:
                            nxt_i, nxt_j = cur_i + di, cur_j + dj
                            if not (0 <= nxt_i < row and 0 <= nxt_j < col):
                                continue
                            if (nxt_i, nxt_j) in visited or grid[nxt_i][nxt_j] == -1:
                                continue
                            visited.add((nxt_i, nxt_j))
                            queue.append((nxt_i, nxt_j))
                    s = 0
                    for ii, jj in visited:
                        s += grid[ii][jj]
                        total_visited.add((ii, jj))
                    total_sum += s
                    lst.append([len(visited), s])
        ans = 0
        for count, s in lst:
            ans += count * (total_sum - s)
        return ans

golang 解法, 执行用时: 176 ms, 内存消耗: 18.6 MB, 提交时间: 2023-10-20 19:35:06

func sumRemoteness(grid [][]int) int64 {
  ans := 0
  dirs := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
  n := len(grid)
  cnt := 0
  for i := range grid {
      for j := range grid[i] {
          if grid[i][j] != -1 {
              cnt++
          }
      }
  }
  var dfs func(i, j int) (s, c int)
  dfs = func(i, j int) (s, c int) {
      if i < 0 || i >= n || j < 0 || j >= n || grid[i][j] == -1 {
          return 0, 0
      }
      s += grid[i][j]
      c++
      grid[i][j] = -1
      for _, d := range dirs {
          x, y := i + d[0], j + d[1]
          t1, t2 := dfs(x, y)
          s += t1
          c += t2
      }
      return s, c
  }
  for i := range grid {
      for j := range grid[i] {
          if grid[i][j] != -1 {
              s, c := dfs(i, j)
              ans += s * (cnt - c)
          }
      }
  }
  return int64(ans)
}

python3 解法, 执行用时: 1256 ms, 内存消耗: 27.3 MB, 提交时间: 2023-10-20 19:34:48

class setUnion:
  def __init__(self, size):
      self.parent = list(range(size))
      self.rank=[1]*size
      self.setCount=size
      
  def find(self,i):
      if self.parent[i]==i:
          return i
      else:
          self.parent[i]=self.find(self.parent[i])
          return self.parent[i]
          
  def union(self,i,j):
      x,y=self.find(i),self.find(j)
      if x==y:
          return
      if self.rank[x]<self.rank[y]:
          x,y=y,x
      self.rank[x]+=self.rank[y]
      self.parent[y]=x
      self.setCount-=1
      
  def is_connected(self,i,j):
      return self.find(i)==self.find(j)
      
  def get_partset(self):
      
      part=defaultdict(list)
      for i in range(len(self.parent)):
          part[self.find(i)].append(i)
      return part
      
class Solution:
  def sumRemoteness(self, grid: List[List[int]]) -> int:
      n=len(grid)
      size,total=n*n,0
      kkk=setUnion(size)
      for i in range(n):
          for j in range(n):
              if grid[i][j]>0:
                  for a,b in [(-1,0),(0,-1)]:
                      cur_i,cur_j=i+a,j+b
                      if cur_i<0 or cur_j<0 or grid[cur_i][cur_j]==-1:
                          continue
                      kkk.union(i*n+j,cur_i*n+cur_j)
                  total+=grid[i][j] 
      x=defaultdict(int)
      for i in range(n):
          for j in range(n):
              if grid[i][j]>0:
                  x[kkk.find(i*n+j)]+=grid[i][j]
      ans=0
      for i in range(n):
          for j in range(n):
              if grid[i][j]>0:
                  ans+=total-x[kkk.find(i*n+j)]
      return ans

上一题