ARTS - 5

134 阅读2分钟

A


124. 二叉树中的最大路径和

描述:

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

分析:

通过递归分治法来解决这个问题。

  1. 计算左右子树的 最大单路径长度 (即 左-根右-根 这三种路径的最大值,不包括 左-根-右 这种情况)
  2. 计算当前节点的 最大单路径长度 ,即 子结点最大单路径长度+根的值根的值 的最大值。
  3. 然后以当前节点的 最大单路径长度左-根-右 的最大值为当前节点的最大的路径和。
  4. 如果节点为 null最大单路径长度 为 0 ,不计算路径和。

R


Using Kotlin’s Delegation to Add Superpowers to a Data Class

文章介绍了如何使用 kotlin 的委托去为固定大小的数据容器提供 Collection 功能。

文章中的固定大小数据容器具体示例是状态管理,如标记用户是否对某些功能有权限。

常用的容器类型有 Data ClassSet<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 ClassSet 的好处。可以很轻松的对功能做检查。

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 }

S


ViewModel 中使用 viewModelScope 代替 CoroutineScope