class Solution {
public:
long long sumRemoteness(vector<vector<int>>& grid) {
}
};
2852. 所有单元格的远离程度之和
给定一个下标从 0 开始的大小为 n * n
的矩阵 grid
,其中每个单元格的值 grid[i][j]
要么是 正整数,要么是表示阻塞单元格的值 -1
。
你可以从一个非阻塞单元格移动到与其共享边的任何非阻塞单元格。
对于任何单元格 (i, j)
,我们定义其 远离程度 R[i][j]
如下:
(i, j)
是 非阻塞 单元格,则 R[i][j]
是值 grid[x][y]
的总和,其中 没有 从 非阻塞 单元格 (x, y)
到单元格 (i, j)
的路径。R[i][j] == 0
。返回所有单元格的 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。
提示:
1 <= n <= 300
1 <= grid[i][j] <= 106
或 grid[i][j] == -1
原站题解
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