做leetcode的时候会看到题解里有些函数要self,有些不需要,因此查阅了一些资料。
看了这篇博文:https://blog.csdn.net/CLHugh/article/details/75000104
笔者认为,做题的时候如果这个函数是类的,那么就需要self,否则则不需要。
以剑指 Offer 55 - II. 平衡二叉树为例:
在类内的:
class Solution:
def recur(self,root):
if not root:return 0
left=self.recur(root.left)
if left==-1:return -1
right=self.recur(root.right)
if right==-1:return -1
return max(left,right)+1 if abs(left-right)<=1 else -1
def isBalanced(self, root: TreeNode) -> bool:
return self.recur(root)!=-1
不在类内的:
class Solution:
def isBalanced(self, root: TreeNode) -> bool:
def recur(root):
if not root:return 0
left=recur(root.left)
if left==-1:return -1
right=recur(root.right)
if right==-1:return -1
return max(left,right)+1 if abs(left-right)<=1 else -1
return recur(root)!=-1
另外发现把函数写在类内的运行时间和跑分结果都比第二种好。
self可以使函数外部的变量在内部不被重定义
当函数内部引用了函数外部的变量,例如外部变量k=1,如果在函数内部k+=1,那么k就是函数内部被重定义了,成为了函数内部的局部变量,最后的结果不会传给外部的k,如果使用self.k+=1或者内部声明 nonlocal k,那么结果也会传给外部的k。如果是列表的中可变数据类型,部调用list.append() 等方法,不会改变引用,也就不需要做 self 和 nonlocal 等操作。
见题目剑指 Offer 54. 二叉搜索树的第k大节点
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
def dfs(root):
if not root:return
dfs(root.right)#因为是第k大,正常中序是左-中-右从小到大,这里要倒着
if k==0:return#提前返回
self.k-=1
if self.k==0:
self.res=root.val#注意这里的res
return
dfs(root.left)
self.k=k
dfs(root)
return self.res