A
描述:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
分析:
通过递归分治法来解决这个问题。
- 计算左右子树的
最大单路径长度
(即左-根
、右-根
,根
这三种路径的最大值,不包括左-根-右
这种情况) - 计算当前节点的
最大单路径长度
,即子结点最大单路径长度+根的值
和根的值
的最大值。 - 然后以当前节点的
最大单路径长度
和左-根-右
的最大值为当前节点的最大的路径和。 - 如果节点为
null
,最大单路径长度
为 0 ,不计算路径和。
R
Using Kotlin’s Delegation to Add Superpowers to a Data Class
文章介绍了如何使用 kotlin 的委托去为固定大小的数据容器提供 Collection 功能。
文章中的固定大小数据容器具体示例是状态管理,如标记用户是否对某些功能有权限。
常用的容器类型有 Data Class
和 Set<T>
两种。
Data Class
data class FeatureSuite(
val featureOne: Feature.TypeA.FeatureOne,
val featureTwo: Feature.TypeA.FeatureTwo,
val featureThree: Feature.TypeB.FeatureThree,
...
)
使用 Data Class
有1个缺点,在获取 TypeA
类型的功能列表时,除了增加1个公共方法去返回所有已知 TypeA
的功能列表外,没有什么好的方法。
Set
val featureSuite = setOf(
Feature.TypeA.FeatureOne(...),
Feature.TypeA.FeatureTwo(...),
Feature.TypeB.FeatureThree(...),
...
)
使用 Set
可以很容易对 TypeA
类型做筛选,但相应的也失去了使用 Data Class
的好处。
Delegation
使用 Delegation
进行如下定义:
data class FeatureSuite(
val featureOne: Feature.TypeA.FeatureOne,
val featureTwo: Feature.TypeA.FeatureTwo,
val featureThree: Feature.TypeB.FeatureThree,
...
) : Set<Feature> by setOf(
featureOne,
featureTwo,
featureThree,
...
)
这样可以同时兼具 Data Class
和 Set
的好处。可以很轻松的对功能做检查。
val typeAFeatures: List<Feature.TypeA> by lazy {
filterIsInsance(Feature.TypeA::class.java)
}
val enabledFeatures: List<Feature> by lazy {
filter { it.isEnabled() }
}
T
在 Fragment KTX 里,可以使用 by viewModels()
来简化 viewModel 的创建方法。
// Retrieve the ViewModel associated with this Fragment
val viewModel: MyVewModel by viewModels { myFactory }
// Retrieve the ViewModel associated with the activity
val activityViewModel: MyVewModel by activityViewModels { myFactory }