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 }