实例变量差异(Python)
instance variable difference (Python)
我对以下解决方案有 2 个问题。
下面是我对这道leetcode问题的回答(解法1):https://leetcode.com/problems/distribute-coins-in-binary-tree/
# Solution 1:
class Solution:
def distributeCoins(self, root: TreeNode) -> int:
self.ans = 0
def dfs(node):
if not node:
return 0
L, R = dfs(node.left), dfs(node.right)
self.ans += abs(L) + abs(R)
return node.val + L + R - 1
dfs(root)
return self.ans
问题 1 我想知道为什么下面的问题不起作用。解一和解二的变量ans
有什么区别?
# Solution 2:
class Solution:
def distributeCoins(self, root: TreeNode) -> int:
ans = 0
self.dfs(root, ans)
return ans
def dfs(self, node, ans):
if not node:
return 0
L, R = self.dfs(node.left, ans), self.dfs(node.right, ans)
ans += abs(L) + abs(R)
return node.val + L + R - 1
因为下面的 grid
变量(解决方案 3)的变化会累积并影响所有每个递归,我认为解决方案 2 也是如此。
问题2解法2的ans
和解法3的grid
有什么区别,使得递归的差异不累加?
(以下是 https://leetcode.com/problems/number-of-islands/ 的解决方案)
# Solution 3:
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
if not grid:
return 0
count = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == '1':
self.dfs(i, j, grid)
count += 1
return count
def dfs(self, i: int, j: int, grid: List[List[str]]):
if i < 0 or j < 0 or i >= len(grid) or j >= len(grid[0]) or grid[i][j] != '1':
return
grid[i][j] = '#'
self.dfs(i + 1, j, grid)
self.dfs(i - 1, j, grid)
self.dfs(i, j - 1, grid)
self.dfs(i, j + 1, grid)
在解决方案 #2 中,您将整数 ans
传递给 dfs
函数,该函数可能会更改它,但调用者看不到此更改,因为整数是不可变的,因此修改后的 ans 是与原始对象无关的新对象 ans=0
.
另一方面,解决方案#3,传递可变对象List
。更改(变异)此对象 grid[i][j] = '#'
对持有(引用)此对象的任何范围都是可见的。
这与更改 self.ans
的解决方案 #1 相同,这又是所有递归范围中同一对象的相同属性。
我对以下解决方案有 2 个问题。
下面是我对这道leetcode问题的回答(解法1):https://leetcode.com/problems/distribute-coins-in-binary-tree/
# Solution 1:
class Solution:
def distributeCoins(self, root: TreeNode) -> int:
self.ans = 0
def dfs(node):
if not node:
return 0
L, R = dfs(node.left), dfs(node.right)
self.ans += abs(L) + abs(R)
return node.val + L + R - 1
dfs(root)
return self.ans
问题 1 我想知道为什么下面的问题不起作用。解一和解二的变量ans
有什么区别?
# Solution 2:
class Solution:
def distributeCoins(self, root: TreeNode) -> int:
ans = 0
self.dfs(root, ans)
return ans
def dfs(self, node, ans):
if not node:
return 0
L, R = self.dfs(node.left, ans), self.dfs(node.right, ans)
ans += abs(L) + abs(R)
return node.val + L + R - 1
因为下面的 grid
变量(解决方案 3)的变化会累积并影响所有每个递归,我认为解决方案 2 也是如此。
问题2解法2的ans
和解法3的grid
有什么区别,使得递归的差异不累加?
(以下是 https://leetcode.com/problems/number-of-islands/ 的解决方案)
# Solution 3:
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
if not grid:
return 0
count = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == '1':
self.dfs(i, j, grid)
count += 1
return count
def dfs(self, i: int, j: int, grid: List[List[str]]):
if i < 0 or j < 0 or i >= len(grid) or j >= len(grid[0]) or grid[i][j] != '1':
return
grid[i][j] = '#'
self.dfs(i + 1, j, grid)
self.dfs(i - 1, j, grid)
self.dfs(i, j - 1, grid)
self.dfs(i, j + 1, grid)
在解决方案 #2 中,您将整数 ans
传递给 dfs
函数,该函数可能会更改它,但调用者看不到此更改,因为整数是不可变的,因此修改后的 ans 是与原始对象无关的新对象 ans=0
.
另一方面,解决方案#3,传递可变对象List
。更改(变异)此对象 grid[i][j] = '#'
对持有(引用)此对象的任何范围都是可见的。
这与更改 self.ans
的解决方案 #1 相同,这又是所有递归范围中同一对象的相同属性。